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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:06:08