📅  最后修改于: 2023-12-03 15:30:22.455000             🧑  作者: Mango
在Dart中,异常是指程序在执行时出现的错误或者异常情况。当异常发生时,程序可以通过异常处理机制来进行捕获和处理,以避免程序崩溃或产生不可预知的结果。本文将介绍Dart的异常处理机制。
Dart中的异常有两种类型:系统异常和用户异常。
系统异常是由Dart虚拟机抛出的异常,通常表示一些内部错误或逻辑异常,例如空指针异常、越界异常等等。用户异常是由应用程序代码主动抛出的异常,通常表示业务逻辑异常或操作失败。
Dart提供了try-catch语句来捕获和处理异常。try语句用于包含可能引发异常的代码块,catch语句用于捕获try语句中抛出的异常。
下面是try-catch语句的基本语法:
try {
//可能引发异常的代码块
} catch (exception) {
//捕获并处理异常
}
其中,try语句中的代码块可能会抛出异常,catch语句中的参数exception表示捕获的异常对象。
需要注意的是,Dart中catch语句是按照异常类型匹配的,如果出现多个catch语句,程序会按照从上到下的顺序依次检查catch语句中的异常类型是否匹配抛出的异常。如果匹配成功,则执行匹配的catch语句;如果匹配不成功,则异常会继续向上抛出,直到有匹配的catch语句为止。
下面是一个简单的示例:
try {
var list = [1, 2, 3];
print(list[3]); //引发越界异常
} catch (exception) {
print(exception.toString()); //打印异常信息
}
运行结果为:
RangeError (index): Invalid value: Not in range 0..2, inclusive: 3
除了根据异常类型匹配的方式外,Dart还提供了一种更精细的方式来匹配不同类型的异常,这就是使用on关键字。
下面是on关键字的语法:
try {
//可能引发异常的代码块
} on Exception1 {
//捕获并处理Exception1类型的异常
} on Exception2 {
//捕获并处理Exception2类型的异常
} catch (exception) {
//捕获并处理其他类型的异常
}
在这种方式下,catch语句可以省略异常参数,因为异常类型已经在on语句中指定了。
下面是一个示例:
try {
var num = 10 ~/ 0; //引发除以零异常
} on IntegerDivisionByZeroException {
print("除数不能为零!");
} catch (exception) {
print(exception.toString());
}
运行结果为:
除数不能为零!
Dart还提供了finally语句来执行无论是否发生异常都要执行的代码。
下面是finally语句的语法:
try {
//可能引发异常的代码块
} catch (exception) {
//捕获并处理异常
} finally {
//不管是否发生异常都要执行的代码
}
finally语句中的代码无论是否有异常都会执行,通常用于清理资源或者释放锁等操作。
下面是一个示例:
import 'dart:io';
void main() {
final File file = File('example.txt');
try {
var contents = file.readAsStringSync(); //读取文件内容
print(contents);
} catch (exception) {
print(exception.toString());
} finally {
//关闭文件资源
file.closeSync();
}
}
在这个示例中,我们打开一个文件并读取其内容,无论读取是否成功,都需要释放文件资源。
Dart中的异常不仅可以被捕获和处理,还可以被应用程序主动抛出。
下面是抛出异常的代码:
throw Exception("这是一个用户异常!");
抛出异常时,需要指定异常类型和异常信息。异常类型可以是任意类型,但通常应该使用Dart内置的异常类型,如Exception、ArgumentError、FormatException等等。
例如,在以下示例中,我们定义了一个函数用于计算两个数字的和,如果其中任意一个参数不是数字类型,就抛出一个FormatException异常。
int sum(num a, num b) {
if(a is! num || b is! num) {
throw FormatException("参数类型不正确!");
}
return a + b;
}
void main() {
try {
var result = sum(10, '20'); //调用sum函数,传入一个数字和一个字符串
print(result);
} catch(exception) {
print(exception.toString()); //输出捕获的异常信息
}
}
运行结果为:
FormatException: 参数类型不正确!
异常处理机制是Dart语言提供的一个重要特性,它可以在程序运行时处理各种异常情况,避免程序崩溃或产生不可预知的结果。在本文中,我们介绍了Dart的异常类型、异常处理语法以及异常抛出机制,希望对大家有所帮助。