dart - 为什么 runZonedGuarded 会阻止以下代码执行?

标签 dart asynchronous

观察以下代码。

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/

相关文章:

android - 在 Flutter 中实现视频提要的最佳方式是什么?

javascript 异步回调生命周期

javascript - Angular typeahead 异步结果 - 在“运算符中接收错误 "TypeError: Cannot use ',以在...中搜索...”

dart - Flutter - 从 Assets 中读取文本文件

dart - 在Dart中添加事件监听器以获取 polymer 中的事件

flutter - TypeAdapterGenerator :- Missing concrete implementation of 'getter TypeAdapter. typeId 尝试实现缺少的方法

flutter - 如何使用BLoC在 flutter 的屏幕之间传递数据?

javascript - Node "actually"如何处理线程?

java - 等待 CompletableFuture 完成,然后返回不同的值?

javascript - 等待多个条件中的异步函数