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

Dart捕获自定义异常后如何访问成员变量及错误原因解析

Dart自定义异常捕获与成员访问问题解决

先看你定义的自定义异常类:

class CustomException implements Exception{
  //Custom Exception class
  String message;
  int numberMessage;
  CustomException(this.message, this.numberMessage);
  
  @override
  String toString() {
    return message;
  }
}

1. 如何捕获自定义异常后访问其成员变量?

有两种常用方法:

方法一:用on指定异常类型 + catch捕获

这是Dart中捕获特定类型异常的标准写法,能直接让捕获的异常对象拥有正确的静态类型,可直接访问成员:

try {
  throw CustomException("异常信息", 10001);
} on CustomException catch (z, stackTrace) {
  print(z.message); // 正常访问message
  print(z.numberMessage); // 正常访问numberMessage
  print(stackTrace); // 可选的栈追踪信息
}

方法二:在catch块内做类型判断/转换

如果不想用on子句,也可以在catch里通过类型检查或转换来访问成员:

try {
  throw CustomException("异常信息", 10001);
} catch (z, stackTrace) {
  // 先判断类型,确保安全
  if (z is CustomException) {
    print(z.message);
    print(z.numberMessage);
  }
  // 或者用as强制转换(仅当确定z是CustomException时使用,否则会抛类型转换异常)
  // CustomException ce = z as CustomException;
  // print(ce.numberMessage);
}

2. 为何会出现上述错误?

关于“getter ...numberMessage isn't defined for class Object”错误

Dart里catch的第一个参数静态默认类型是Object,虽然运行时这个对象的runtimeType是CustomException,但编译器做静态检查时,只会识别它的静态类型Object——而Object类并没有numberMessage这个成员,所以会报错。运行时类型不影响编译阶段的静态类型检查。

关于catch(CustomException z, t)的语法错误

Dart的语法规则明确:如果要捕获特定类型的异常,必须先通过on 异常类型声明要捕获的类型,再跟上catch(...)。直接在catch的参数里指定类型不符合语法规范,因此会触发语法错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:00:12