Flutter/Dart中抛出Error与Exception的方法及差异解析
Flutter/Dart 中 Error 与 Exception 的核心差异及实践指南
1. 抛出场景的核心区别
抛出 Error 的场景
Error 本质是程序逻辑层面的致命错误,属于开发者的代码bug,这类问题不可恢复,必须通过修复代码解决,而非捕获处理。典型场景:
- 访问
null对象的成员(触发NullError) - 逻辑上不可能进入的分支(比如switch覆盖所有可能情况却走到了default)
- 资源耗尽(栈溢出
StackOverflowError、内存不足OutOfMemoryError) - 对象处于非法状态时调用方法(比如对已关闭的Stream添加监听,触发
StateError)
抛出 Exception 的场景
Exception 是可预见、可恢复的运行时异常,属于业务或环境层面的预期外情况,这类问题可以通过捕获后处理让程序继续运行。典型场景:
- 网络请求超时/失败(
SocketException) - 读取本地文件时文件不存在
- 用户输入不符合格式要求(比如解析字符串为数字失败,触发
FormatException) - 调用第三方API返回业务错误
2. try/catch 的捕获原则
Exception:必须捕获并处理
因为Exception是可恢复的异常,捕获后可做针对性处理,比如提示用户重试、创建缺失的文件、展示错误信息等。示例:try { await File('test.txt').readAsString(); } on FileSystemException catch (e) { // 文件不存在,创建新文件 await File('test.txt').create(); }Error:禁止捕获(除全局上报)
Error代表程序的致命bug,捕获后强行继续运行会导致更隐蔽的问题甚至数据损坏。唯一例外是在应用最顶层做全局错误上报(比如Flutter的FlutterError.onError),用于收集崩溃日志方便后续修复。
3. Error 子类与基础 Error 的差异,及类型列表
Dart中 Error 是所有错误类型的基类,ArgumentError、NullError 等都是它的子类,每个子类对应特定的逻辑错误场景:
ArgumentError:方法参数不符合要求时抛出(比如给要求非空的参数传null,或数值超出允许范围)NullError:访问null对象的成员时触发RangeError:索引超出集合范围(比如list[10]但列表只有5个元素)StateError:对象状态非法时调用方法(比如重复初始化已初始化的对象)
常见的Exception子类包括:
FormatException:格式解析失败(比如int.parse('abc'))SocketException:网络连接异常FileSystemException:文件系统操作异常
查看所有类型的方式:在IDE(Android Studio/VS Code)中按住Ctrl(Mac是Cmd)点击 Error 或 Exception 类,就能查看SDK中定义的所有子类。
内容的提问来源于stack exchange,提问作者Mercutio1243
相关产品推荐
相关产品推荐

