weekly 2024-06-17
MoonBit 更新
- 支持了错误处理机制
- 函数返回值类型可以用
Int!String
来标识这个函数正常情况下返回Int
,错误情况下会抛出类型为String
的错误值,比如
fn div(x: Int, y: Int) -> Int!String { .. }
raise
关键字用于中断当前控制流,直接抛出错误,比如
fn div(x: Int, y: Int) -> Int!String {
if y == 0 { raise "divide by 0" }
x / y
}
try { expr0 } catch { pattern1 => expr1; pattern2 => expr2; .. }
表达 式可以用于捕获expr0
中抛出的错误,并对其进行模式匹配来处理,比如下面这个函数调用上面的div
函数,并在div
函数抛出错误的时候将错误信息打印,并返回默认值
fn div_with_default(x: Int, y: Int, default: Int) -> Int {
try {
div(x, y)!
} catch {
s => { println(s); default }
}
}
- 此外,可以用后缀运算符
!
和!!
进行错误处理,这些后缀运算符只能应用于函数调用,其中:f(x)!
将调用f
的过程中发生的错误立即重新抛出。f(x)!!
则会在f
发生错误的情况下直接 panic,其等价于
try { f(x)! } catch { _ => panic() }
函数调用的形式包括方法调用,中缀运算符和管道运算符的调用,比如
fn init {
let _ = x.f()!!
let _ = (x + y)!!
let _ = (x |> f)!!
}