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 中。