You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:46:00