Flutter中如何全局捕获自定义抛出的异常?
全局捕获Flutter自定义异常的解决方案
你当前设置的FlutterError.onError仅处理Flutter框架内部的错误,PlatformDispatcher.instance.onError负责捕获平台级的未捕获异常,但异步函数中未被局部try/catch处理的自定义抛出异常(比如你HTTP请求里的throw Exception)需要通过Zone来实现全局捕获。
实现步骤
使用runZonedGuarded包裹整个应用的初始化逻辑,它可以捕获所有未被局部try/catch处理的同步、异步异常:
修改你的main.dart代码如下:
void main() async { MyErrorsHandler.initialize(); // 用Zone包裹全局逻辑,捕获所有未处理异常 runZonedGuarded(() async { // 保留原有Flutter框架错误处理 FlutterError.onError = (details) async { FlutterError.presentError(details); MyErrorsHandler.onErrorDetails(details); }; // 保留平台级错误处理 PlatformDispatcher.instance.onError = (error, stack) { MyErrorsHandler.onError(error, stack); return true; }; runApp(const ProviderScope(child: MyApp())); }, (error, stackTrace) { // 处理所有未被局部捕获的自定义异常(包括异步抛出的) MyErrorsHandler.onError(error, stackTrace); }); }
关键说明
- 当你在
getAsync中抛出异常,且调用该方法时没有用局部try/catch捕获,这个异常会被runZonedGuarded的错误回调捕获并交给MyErrorsHandler处理。 - 如果调用
getAsync时使用了try/catch做局部处理,异常会被局部捕获,不会触发全局处理逻辑,这符合异常处理的分层设计。 runZonedGuarded可以覆盖所有未被显式处理的异常场景,包括同步代码抛出、异步函数未捕获的异常,完美补充你原有两种错误处理的覆盖范围。
内容的提问来源于stack exchange,提问作者Simple Code
相关产品推荐
相关产品推荐

