E4174#
编译器诊断名称:control_in_defer。
defer 内部存在无效的控制流。
defer 右侧是清理代码,会在外围作用域退出时运行。它不能改变外围作用域的退出方式。MoonBit 会拒绝 defer 内部的 return、break、continue、raise、对可能抛出错误的函数的调用,以及 async 调用。
错误示例#
fn answer() -> Int {
defer { return 42 }
0
}
return 会试图从清理代码中退出外围函数,因此会被拒绝。
建议#
只在返回 Unit、不会抛出错误的同步清理代码中使用 defer。控制流应在注册延迟清理之后执行。
fn answer() -> Int {
defer println("leaving answer")
42
}