Dart构造函数抛出的异常无法捕获?正确捕获方法是什么?
Dart中捕获构造函数抛出的异常的正确方式
你的代码里异常没被捕获的核心原因是抛出的异常类型和catch块捕获的类型不匹配:
- 构造函数里
throw 'Exception'抛出的是一个字符串类型的值 - 而
on Exception catch (e)只负责捕获Exception类(以及它的子类)的实例,字符串不属于这个范畴,所以catch块不会触发。
下面是两种正确的解决方式:
方法一:抛出标准Exception实例
把构造函数里的抛出语句改成抛出Exception类的实例,这样原来的catch块就能正常捕获:
class MyClass{ MyClass(){ throw Exception('发生异常'); // 抛出Exception实例 } } testCatchException(){ try { MyClass myClass = MyClass(); } on Exception catch (e) { print('Exception caught: ${e.toString()}'); } }
方法二:捕获所有类型的异常
如果需要捕获包括字符串、数字等非Exception类型的异常,可以去掉类型限制,或者明确捕获Object类型(Dart中所有类型都继承自Object):
class MyClass{ MyClass(){ throw 'Exception'; // 依然抛出字符串 } } testCatchException(){ try { MyClass myClass = MyClass(); } catch (e) { // 无类型限制,捕获所有异常 print('Exception caught: $e'); } }
或者用on Object catch (e),效果和上面一致,更明确:
try { MyClass myClass = MyClass(); } on Object catch (e) { print('Exception caught: $e'); }
内容的提问来源于stack exchange,提问作者Valkyrie
相关产品推荐
相关产品推荐

