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
相关产品推荐
相关产品推荐

