Flutter升级2.2.2后Future抛出的自定义异常无法被指定类型捕获
问题根因
该问题是Flutter 2.2.2配套的Dart 2.13版本对类型匹配规则收紧导致的,不属于Flutter框架bug,90%以上的场景是自定义异常类的导入方式混用触发的。
常见触发场景
- 同一个
ApiException类,在抛出异常的文件里用相对路径导入,在捕获异常的文件里用package:开头的绝对路径导入,Dart 2.13+会将两种导入方式引入的类判定为不同类型,导致on ApiException无法匹配上抛出的异常实例。 - 项目中存在多个重名的
ApiException类,抛出和捕获时导入的不是同一个类。 - 部分场景下热重载未完全更新类型缓存,也会偶发该问题。
排查修复步骤
- 先在兜底catch块中增加类型校验代码,确认类型是否匹配:
catch(e) { print("抛出异常的类型:${e.runtimeType}"); print("当前文件导入的ApiException类型:$ApiException"); print("两个类型是否一致:${e.runtimeType == ApiException}"); rethrow; }
如果打印的两个类型不一致,即可确认是导入方式问题。
2. 统一所有用到ApiException的文件的导入规则,全部使用package:开头的绝对路径导入,避免相对路径和绝对路径混用。
3. 清理项目缓存后重新编译:执行flutter clean后再运行项目,排除热重载缓存导致的类型异常。
补充说明
Dart 2.13之前的版本对相对/绝对导入的同一个类做了兼容判定,会识别为同一类型,升级后规则收紧,因此会出现在旧版本正常捕获、新版本无法捕获的现象。
内容的提问来源于stack exchange,提问作者testerino
相关产品推荐
相关产品推荐

