E0092

E0092#

警告名称:fragile_catch_all

兜底处理器执行清理后重新抛出同一个错误。这种写法并不稳健,因为将来兜底处理器不会捕获异步取消,而操作被取消时仍需执行清理。

错误示例#

///|
fn operation_that_may_fail() -> Unit raise {
  fail("operation failed")
}

///|
pub fn run() -> Unit raise {
  try operation_that_may_fail() catch {
    error => {
      println("cleanup")
      raise error
    }
  }
}

该处理器不会从错误中恢复或转换错误;它只在继续传播错误之前执行清理。

修改建议#

将兜底处理器替换为 errdefer。这样,后续主体因错误退出时就会执行清理,并自动传播原始错误。

///|
fn operation_that_may_fail() -> Unit raise {
  fail("operation failed")
}

///|
pub fn run() -> Unit raise {
  errdefer println("cleanup")
  operation_that_may_fail()
}

如果处理器必须检查错误,请将该逻辑保留在 catch 中,但把独立的清理移到 errdefer 中。