类似java, Dart也提供了异常处理机制,主要有两种异常类型Exception和Error,当然我们也可以继承这两种基础异常类型,然后自定义新的异常类型。
Exception是我们可以预知的错误,Error是程序错误。例如,调用函数参数错误。
提示:Dart语言的异常处理跟java不一样的地方是,不强制一定要捕获异常,函数也不需要定义自己可能会抛出什么异常。
1.抛出异常
使用throw 抛出异常,在Dart语言中我们可以抛出任何非null的对象,不一定是 Exception 和Error或者他们的子类。
例如:
// 直接抛出String对象
throw '欢迎访问www.tizi365.com';
提示:一般建议抛出Exception和Error,或者他们的子类。
抛出异常对象的例子:
throw Exception('参数错误!');
2.捕获异常(catch)
通过try/catch语句捕获异常例子:
try {
// 业务代码
} on OutOfLlamasException { // 通过on 指定要拦截的异常类型
// 处理异常1
} on Exception catch (e) { // 通过on 指定拦截的异常类型,通过 catch 捕获异常对象
// 拦截所有Exception和他的子类抛出的异常。
print('Unknown exception: $e');
} catch (e) {
// 没有指定异常类型,只是catch异常对象,那相当于捕获所有异常类型。
print('Something really unknown: $e');
}
使用rethrow重新抛出异常
try {
dynamic foo = true;
print(foo++); // 这里会产生Runtime error
} catch (e) {
print('捕获到的异常类型 ${e.runtimeType}.');
rethrow; //重新把异常丢出去
}
获取异常调用栈,捕获到异常的时候我们希望知道异常是什么地方丢出来的,可以通过catch的第二个参数获取调用栈。
try {
// ···
} catch (e, s) {
print('异常信息:\n $e');
print('调用栈信息:\n $s');
}
3.Finally
如果我们希望无论是否捕获到异常,都要执行一些操作。例如,关闭文件。可以使用finally
try {
// 业务代码
} catch (e) {
print('Error: $e'); // 处理异常
} finally { // 无论是否捕获异常都会执行finally的代码
cleanTask(); // 执行清理工作。
}