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

异步函数异常被Crashlytics拦截,如何让其仅捕获未处理异常?

问题分析与解决方案

为什么你的异常没被捕获?

你在onTap中调用了异步函数launchMap,但既没有用await等待它执行完成,也没给onTap标记为async。异步函数抛出的异常如果没有被await绑定到当前调用栈,会直接逃逸到runZonedGuarded的全局错误处理器中,导致你的局部try/catch根本抓不到这个异常。

第一步:修正异常捕获逻辑

把onTap改成异步函数,并使用await调用launchMap,这样局部try/catch就能捕获到异步抛出的异常:

onTap: () async {
  try {
    await launchMap(my_address);
  } on CannotOpenMapException {
    print('caught exception!');
  }
}

第二步:确保Crashlytics只捕获未处理的异常

你当前使用的runZonedGuarded配置本身就符合需求——它只会捕获未被任何局部try/catch处理的异步异常,而Flutter框架层面的错误(如Widget构建失败)则通过FlutterError.onError上报。

只要你在代码中正确处理了异常(比如上面的await+try/catch),这些已处理的异常就不会被Crashlytics记录。只有当异常完全未被捕获时,才会被runZonedGuarded的错误处理器接管并上报Crashlytics。

额外验证

如果想确认Crashlytics的行为,可以故意留一个未处理的异步异常(比如不写try/catch),此时这个异常会被runZonedGuarded捕获并上报;而处理过的异常则不会出现在Crashlytics的控制台中。

内容的提问来源于stack exchange,提问作者hansaplast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:09:18