📅  最后修改于: 2020-11-05 04:24:26             🧑  作者: Mango
异常(或例外事件)是在程序执行期间出现的问题。当发生异常时,程序的正常流程将中断,并且程序/应用程序将异常终止。
内置Dart例外包括-
Sr.No | Exceptions & Description |
---|---|
1 |
DeferredLoadException Thrown when a deferred library fails to load. |
2 |
FormatException Exception thrown when a string or some other data does not have an expected format and cannot be parsed or processed. |
3 |
IntegerDivisionByZeroException Thrown when a number is divided by zero. |
4 |
IOException Base class for all Inupt-Output related exceptions. |
5 |
IsolateSpawnException Thrown when an isolate cannot be created. |
6 |
Timeout Thrown when a scheduled timeout happens while waiting for an async result. |
Dart中的每个异常都是预定义类Exception的子类型。必须处理异常以防止应用程序突然终止。
try块嵌入了可能会导致异常的代码。当需要指定异常类型时,使用on块。当处理程序需要异常对象时,将使用catch块。
在try块之后,必须紧跟一个on / catch块或一个finally块(或两者之一)。当try块中发生异常时,控制权将转移到catch 。
处理异常的语法如下:
try {
// code that might throw an exception
}
on Exception1 {
// code for handling exception
}
catch Exception2 {
// code for handling exception
}
以下是要记住的一些要点-
一个代码片段可以有多个on / catch块来处理多个异常。
on块和catch块是相互包含的,即try块可以与on块和catch块都关联。
以下代码说明了Dart中的异常处理-
以下程序将分别由变量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块(而不是ON块)包含处理异常的代码。 catch的参数包含运行时引发的异常对象。
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
catch(e) {
print(e);
}
}
它应该产生以下输出–
IntegerDivisionByZeroException
下面的示例演示如何使用on … catch块。
main() {
int x = 12;
int y = 0;
int res;
try {
res = x ~/ y;
}
on IntegerDivisionByZeroException catch(e) {
print(e);
}
}
它应该产生以下输出–
IntegerDivisionByZeroException
final块包含无论异常发生与否都应执行的代码。可选的finally块在try / on / catch之后无条件执行。
使用finally块的语法如下-
try {
// code that might throw an exception
}
on Exception1 {
// exception handling code
}
catch Exception2 {
// exception handling
}
finally {
// code that should always execute; irrespective of the exception
}
以下示例说明了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 {
// 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();
}
}
在上面的代码中,我们定义了一个自定义异常AmtException 。如果传递的数量不在例外范围内,则代码将引发异常。主函数将函数调用包含在try … catch块中。
该代码应产生以下输出–
Amount should be greater than zero
Ending requested operation....