Dart
提供了Exception
和Error
以及一些子类型,也支持自定义异常类型。- 有别于
Java
,Dart
异常属于非检查异常。方法不一定声明了所抛出的异常, 也不要求捕获任何异常。 Dart
支持抛出任何非null
对象作为异常,不仅限于实现了Exception
/Error
的对象。catch
中无法指定具体异常类型,需要结合on
来使用。- 使用
rethrow
关键字可以把捕获的异常重新抛出。 finally
关键字的使用和Java
一致。
void f1() {
throw Exception("Juice");
}
void main() {
try {
f1();
} catch (e,s) {
print(e.runtimeType);
print(s.runtimeType);
print(e);
}
}
运行结果为_Exception
_StackTrace
Exception: Juice
区别于java
中的catch
语句catch(Exception e)
,Dart
指明对象的具体类型。e
代表抛出的异常对象,s
表示异常堆栈信息。(命名可以不用e
s
,不需要使用异常堆栈信息,也可以直接改为catch(e)
)
int f2(int i) {
if (i == 1) {
throw 300;
} else if (i == 2) {
throw "Juice";
} else if (i == 3) {
throw print;
}
return i;
}
void f3(int i) {
try {
int result = f2(i);
print(result);
} on int catch (e) {
print("int");
} on String catch (e) {
print("String");
} on Function catch (e) {
e("Function");
}
}
void main() {
f3(1);
f3(2);
f3(3);
f3(99);
}
f2
方法输入值为1
2
3
是分别抛出int
String
Function
对象(非 Exception
/Error
对象),其他时候正常返回值。
f3
方法则是执行f2
方法,捕获异常(结合on
使用),并对响应异常进行操作。
输入值为1
时,抛出300,执行f3
中捕获int
对象操作,输出int
输入值为2
时,抛出字符串Juice
,执行f3
中捕获String
对象操作,输出String
输入值为3
时,抛出方法print
,执行f3
中捕获Function
对象操作(此时的对象e
即为print
方法),输出Function
输入值为99
时,正常执行,输出99