假设在Flutter应用程序中,我们想要在顶层捕获任何未经处理的异常/错误,那么根据文档,我们可以这样做:
main() {
// All uncaught errors thrown from synchronous code blocks will end up here:
FlutterError.onError = (FlutterErrorDetails details) {
MyLogger.instance.logUncaughtErrorSync(details);
};
// All uncaught errors thrown from async code blocks will end up here:
PlatformDispatcher.instance.onError = (Object error, StackTrace stack) {
MyLogger.instance.logUncaughtErrorASync(error, stack);
return true;
};
runApp(const MyApp());
文档似乎暗示了两者之间的区别是错误源自Dart(特别是“Flutter”)代码还是平台(Android / IOS)代码,但通过我的测试,我只能看出两者之间的区别是对象(错误)是否来自异步和同步的Dart代码。
例如,如果在Dart代码中(而不是平台代码),我们只需输入:
_function() async {
throw('error');
}
当我们调用该函数时,它将通过“平台调度程序”冒泡并被视为“平台错误”,但似乎只是因为它发生在后台线程?
实际上似乎没有机制允许从Java或Swift代码抛出的异常触发这两个onError函数。
然而,这其中必须有更多内容,那么为什么要有两种不同的机制(具有不同的输入 - FlutterErrorDetails vs Object + StackTrace)...真正的区别是什么?