异步函数异常被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
相关产品推荐
相关产品推荐

