当然,最佳做法是始终使用catchError()
(或使用await
和try
/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'...