如何全局捕获未处理的 Future 错误?
How to globally catch unhandled Future errors?
最佳做法当然是始终使用 catchError()
(或使用 await
和 try
/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'...
最佳做法当然是始终使用 catchError()
(或使用 await
和 try
/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'...