Dart 编程 - 异常
异常(或异常事件)是在程序执行过程中出现的问题。发生异常时,程序的正常流程会中断,程序/应用程序会异常终止。
内置 Dart 异常包括 −
Sr.No | 异常 &描述 |
---|---|
1 |
DeferredLoadException 当延迟库加载失败时抛出。 |
2 |
FormatException 当字符串或其他数据没有预期格式且无法解析或处理时抛出异常。 |
3 |
IntegerDivisionByZeroException 当数字除以零时抛出。 |
4 |
IOException 所有 Inupt-Output 相关异常的基类。 |
5 |
IsolateSpawnException 无法创建隔离时抛出。 |
6 |
Timeout 等待异步结果时发生预定超时时抛出。 |
Dart 中的每个异常都是预定义类 Exception 的子类型。必须处理异常以防止应用程序突然终止。
try / on / catch 块
try 块嵌入可能导致异常的代码。当需要指定异常类型时,使用 on 块。当处理程序需要异常对象时,使用 catch 块。
try 块后面必须紧跟一个 on / catch 块或一个 finally 块(或两者之一)。当 try 块中发生异常时,控制权将转移到 catch。
处理异常的语法如下所示 −
try { // 可能抛出异常的代码 } on Exception1 { // 处理异常的代码 } catch Exception2 { // 处理异常的代码 }
以下是需要记住的一些要点 −
代码片段可以有多个 on / catch 块来处理多个异常。
on 块和 catch 块是相互包含的,即 try 块可以与 on 块和 catch 块相关联。
以下代码说明了 Dart 中的异常处理 −
示例:使用 ON 块
以下程序将分别由变量 x 和 y 表示的两个数字相除。由于尝试除以零,代码会引发异常。on 块 包含处理此异常的代码。
main() { int x = 12; int y = 0; int res; try { res = x ~/ y; } on IntegerDivisionByZeroException { print('Cannot divide by zero'); } }
它应该产生以下输出 −
Cannot divide by zero
示例:使用 catch 块
在下面的示例中,我们使用了与上面相同的代码。唯一的区别是这里的 catch 块(而不是 ON 块)包含处理异常的代码。catch 的参数包含运行时抛出的异常对象。
main() { int x = 12; int y = 0; int res; try { res = x ~/ y; } catch(e) { print(e); } }
它应该产生以下输出 −
IntegerDivisionByZeroException
示例:on…catch
以下示例显示如何使用 on...catch 块。
main() { int x = 12; int y = 0; int res; try { res = x ~/ y; } on IntegerDivisionByZeroException catch(e) { print(e); } }
它应该产生以下输出 −
IntegerDivisionByZeroException
Finally 块
finally 块包含无论是否发生异常都应执行的代码。可选的 finally 块在 try/on/catch 之后无条件执行。
使用 finally 块的语法如下 −
try { // 可能引发异常的代码 } on Exception1 { // 异常处理代码 } catch Exception2 { // 异常处理 } 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 关键字用于显式抛出异常。应处理抛出的异常以防止程序突然退出。
显式抛出异常的语法是 −
throw new Exception_name()
示例
以下示例显示如何使用 throw 关键字抛出异常 −
main() { try { test_age(-2); } catch(e) { print('Age cannot be negative'); } } void test_age(int age) { if(age<0) { throw new FormatException(); } }
它应该产生以下输出 −
Age cannot be negative
自定义异常
如上所述,Dart 中的每个异常类型都是内置类 Exception 的子类型。Dart 允许通过扩展现有异常来创建自定义异常。定义自定义异常的语法如下 −
语法:定义异常
class Custom_exception_Name implements Exception { // 可以包含构造函数、变量和方法 }
应明确引发自定义异常,并在代码中处理。
示例
以下示例展示了如何定义和处理自定义异常。
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(); } }
在上面的代码中,我们定义了一个自定义异常,AmtException。如果传递的金额不在例外范围内,代码将引发异常。main 函数将函数调用包含在 try...catch 块中。
代码应产生以下输出 −
Amount should be greater than zero Ending requested operation....