E4174

E4174#

编译器诊断名称:control_in_defer

defer 内部存在无效的控制流。

defer 右侧是清理代码,会在外围作用域退出时运行。它不能改变外围作用域的退出方式。MoonBit 会拒绝 defer 内部的 returnbreakcontinueraise、对可能抛出错误的函数的调用,以及 async 调用。

错误示例#

fn answer() -> Int {
  defer { return 42 }
  0
}

return 会试图从清理代码中退出外围函数,因此会被拒绝。

建议#

只在返回 Unit、不会抛出错误的同步清理代码中使用 defer。控制流应在注册延迟清理之后执行。

fn answer() -> Int {
  defer println("leaving answer")
  42
}