如何全局捕获未处理的 Future 错误?

How to globally catch unhandled Future errors?

最佳做法当然是始终使用 catchError()(或使用 awaittry/catch 将错误处理程序附加到 Future .但是假设我忘记了,或者假设这个错误严重到我们 想要 它使整个应用程序崩溃(就像我们可以对同步异常所做的那样),或者我想记录错误,或将其报告给 Crashlytics 等服务,让我意识到自己的罪过。

Dart 的 Future 实际上与 JavaScript 的 Promise 相同。在 NodeJS 中,我们可以将处理程序附加到全局 unhandledRejection event 以添加自定义行为。

Dart 是否提供类似的东西?我查看了异步和 Future 文档,但找不到任何相关内容。

看看 runZonedGuarded static method. It will executing a given method in its own Zone 可以附加一个方法来处理任何未捕获的错误。

我在这里做了一个简单的例子,它展示了如果抛出异步错误而没有任何错误处理会发生什么:

import 'dart:async';
import 'dart:io';

void main() {
  runZonedGuarded(program, errorHandler);
}

Future<void> program() async {
  final file = File('missing_file.txt');
  await file.openRead().forEach(print);
}

void errorHandler(Object error, StackTrace stack) {
  print('OH NO AN ERROR: $error');
}

哪个returns:

OH NO AN ERROR: FileSystemException: Cannot open file, path = 'missing_file.txt'...