一、Exception类

Exception class API
由所有核心库异常实现的标记接口。
异常旨在向用户传达有关故障的信息,以便以编程方式解决错误。它旨在被捕获,并且应该包含有用的数据字段。
Creating instances of Exception directly with Exception(“message”) is discouraged in library code since it doesn’t give users a precise type they can catch. It may be reasonable to use instances of this class in tests or during development.
库代码中不鼓励直接使用Exception(“message”)创建异常实例,因为它不能为用户提供他们可以捕获的精确类型。在测试或开发过程中使用此类实例可能是合理的。

1. 子类
DeferredLoadException,FormatException,IntegerDivisionByZeroException,IOException,IsolateSpawnException,NullRejectionException,OSError,TimeoutException


2. 构造函数
Exception([dynamic message])
factory


3. 成员属性
hashCode → int
The hash code for this object. […]
read-only, inherited
․‥…․‥…․‥…․‥…․‥…․‥…․‥…․‥…․‥…․‥…
runtimeType → Type
A representation of the runtime type of the object.
read-only, inherited


4. 方法
noSuchMethod(Invocation invocation) → dynamic
Invoked when a non-existent method or property is accessed. […]
inherited
․‥…․‥…․‥…․‥…․‥…․‥…․‥…․‥…․‥…․‥…
toString() → String
A string representation of this object. […]
inherited


5. 运算符
operator ==(Object other) → bool
The equality operator. […]
inherited


一、内置异常
序号描述
1DeferredLoadException
延迟库无法加载时抛出。
2FormatException
当字符串或某些其他数据不具有预期格式且无法解析或处理时抛出异常。
3IOException
所有与Inupt-Output相关的异常的基类。
4IsolateSpawnException
无法创建隔离时抛出。
5NullRejectionException
拒绝承诺而使用null或undefined值时抛出。
6OSError
来自操作系统的错误。
7Timeout
在等待异步结果时发生计划超时时抛出。
8IntegerDivisionByZeroException
当数字除以零时抛出。
@Deprecated(“Use UnsupportedError instead”)
二、捕获异常:try / on / catch / on…catch及finally 块

try块包裹可能出现异常的代码。
需要指定异常类型时使用on块。
catch块捕获异常对象,进而进行处理。

记住:

  • 代码段可以有多个 on / catch 块来处理多个异常。
  • on块和catch块是相互包含的,即try块可以与on块和catch块相关联。

示例:

  1. tryon块:
main() {
   int x = 12;
   int y = 0;
   int res;
   try {
      res = x ~/ y;
   } on IntegerDivisionByZeroException {
      print('不能除以零');// output:不能除以零
   }
}
  1. catch块:
    catch 的参数包含在运行时抛出的异常对象。而on不包含异常对象。
main() {
   int x = 12;
   int y = 0;
   int res;  
   try {  
      res = x ~/ y;
   } catch(e) {
      print(e);// output:IntegerDivisionByZeroException
   }
}
  1. on ... catch块:
main() {
   int x = 12;
   int y = 0;
   int res;  
   try {
      res = x ~/ y;// ~/:相除并返回一个整数结果
   } on IntegerDivisionByZeroException catch(e) {
      print(e);// output:IntegerDivisionByZeroException
   }
}

如果改变异常对象类:

try {
      res = x ~/ y;
   } on FormatException catch(e) {
      print("catch it:" + e.toString());
   }

运行报错:
Unhandled exception:
IntegerDivisionByZeroException

如果改成如下,就正常运行了。因为catch(e)捕获了所有可能的异常。

try {
      res = x ~/ y;
   } on FormatException {
      print("is a FormatException!");
   } catch(e) {
      print("caught it:" + e);
   }
caught it:IntegerDivisionByZeroException

即:on…catch块,只捕获紧跟on后面的异常对象!

  1. finally块:
    finally 块包括应该执行无关的异常的发生的代码。
main() {
   int x = 12;
   int y = 0;
   int res;  
   try {
      res = x ~/ y;
   } on IntegerDivisionByZeroException {
      print('Cannot divide by zero');
   } finally {
      print('Finally block executed');// 总是执行;不顾异常
   }
}
Cannot divide by zero
Finally block executed
三、抛出异常

throw 关键字用来明确地抛出异常。应该处理引发的异常,以防止程序突然退出。

main() {
   try {
      test_age(-2);
   } catch(e) {
      print('Age cannot be negative');
      print(e);
   }
}  
void test_age(int age) {
   if (age < 0) {
      throw new FormatException();
   }
}
Age cannot be negative
FormatException
四、自定义异常

如上所述,Dart中的每个异常类型都是内置类 Exception 的子类型。Dart可以通过扩展现有异常来创建自定义异常。定义自定义异常的语法如下所示:

class Custom_exception_Name implements Exception {
   // can contain constructors, variables and methods
}
class AmtException implements Exception {
   String errMsg() => 'Amount should be greater than zero';
}  
void main() {
   try {
      withdraw_amt(-1);
   } catch(e) {
      print(e.errMsg());
   } finally {
      print('Ending requested operation.....');
   }
}  
void withdraw_amt(int amt) {
   if (amt <= 0) {
      throw new AmtException();
   }
}
Amount should be greater than zero
Ending requested operation....
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐