观察以下代码。
void main() async {
await runZonedGuarded(
() async {
print("a");
throw "error";
},
(e, s) {
print("b");
},
);
print("c");
}
它只打印...
a
b
而不是...
a
b
c
如果我删除它打印的 throw
a
c
有人可以解释一下这里到底发生了什么吗?为什么 c 在第一种情况下不打印?
谢谢!
最佳答案
Dart 有 "error zones" 的概念。当您在区域中引入错误处理程序时,属于该区域的任何错误 future 将拒绝将其错误传播到属于不同错误区域的 future。
runZonedGuarded
函数安装一个错误处理程序来处理异步错误,但这也意味着您返回的 future 是 Future<void>
,属于该区域。您不会在 runZonedGuarded
内抛出错误,而是返回一个包含错误的 future。
onError
返回时不会触发处理程序。
当您尝试await
时 future ,在离开该功能后,错误区会妨碍。而不是在 await
重新抛出错误,它反而使错误成为错误区域中 Uncaught Error (这就是它打印 b
的原因),然后 future 在 await
处根本无法完成 。
这非常令人困惑。
另请参阅:https://github.com/dart-lang/sdk/issues/39825
建议:不要从 runZonedGuarded
返回 future 。这……不太有用,因为使用区域的根本原因是进行异步计算。
关于dart - 为什么 runZonedGuarded 会阻止以下代码执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69411627/