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



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

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

飞镖提供类似的东西吗?我浏览了异步和Future文档,但找不到任何相关内容。

看看runZonedGuarded静态方法。它将以自己的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');
}

其中返回:

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

最新更新