异常表示一些未知的错误情况。 如果异常没有被捕获, 则异常会抛出, 导致抛出异常的代码终止执行。
Dart 代码可以抛出和捕获异常。 和 Java 有所不同, Dart 中的所有异常是非检查异常。 方法不会声明它们抛出的异常, 也不要求捕获任何异常。
Dart 提供了 Exception 和 Error 类型, 以及一些子类型。 当然也可以定义自己的异常类型。 但是,此外 Dart 程序可以抛出任何非 null 对象, 不仅限 Exception 和 Error 对象。
高质量的生产环境代码通常会实现 Error 或 Exception 类型的异常抛出。
关键字Throw抛出异常:
void throwInfo (String msg){
if(msg == null){
throw FormatException('Expected at least 1 section');
}
}
当然我们也可以抛出任意的对象:
void throwInfo (String msg){
//当然我们也可以抛出任意的异常。
if(msg == null){
throw 'Out of llamas!';
}
}
另外,当我们抛出多个异常的时候,只有第一个异常有效,之后的异常都会被置灰无效:
关键字Catch捕获异常:
捕获异常可以避免异常继续传递(除非重新抛出( rethrow )异常)。 可以通过捕获异常的机会来处理该异常:
——on可以捕获到某一类的异常,但是获取不到异常对象;
——catch可以捕获到异常对象。这个两个关键字可以组合使用;
——rethrow可以重新抛出捕获的异常。
void catchInfo() {
try {
//TODO:
} on FormatException catch (e) {
// 如果匹配不到FormatException,则会继续匹配
print("catch format exception");
print(e);
rethrow; // 重新抛出异常
} on Exception {
// 匹配不到Exception,会继续匹配
print("catch exception");
} catch (e, r) {
// 匹配所以类型的异常. e是异常对象,r是StackTrace对象,异常的堆栈信息
print(e);
}
}
如上述代码所示,捕获语句中可以同时使用 on 和 catch ,也可以单独分开使用。 使用 on 来指定异常类型, 使用 catch 来 捕获异常对象。
catch() 函数可以指定1到2个参数, 第一个参数为抛出的异常对象, 第二个为堆栈信息 ( 一个 StackTrace 对象 )。
try {
//TODO:
} on Exception catch (e) {
print('Exception details:\n $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}
如果仅需要部分处理异常, 那么可以使用关键字 rethrow 将异常重新抛出。
关键字Finally
不管是否抛出异常, finally 中的代码都会被执行。 如果 catch 没有匹配到异常, 异常会在 finally 执行完成后,再次被抛出,这一点与Java完全相同的。
try {
print('TODO Sth');
} finally {
//TODO:
}
任何匹配的 catch 执行完成后,再执行 finally :
try {
//TODO:
} catch (e) {
print('Error: $e');
} finally {
print('TODO Sth');
}
抛出特定于应用程序的异常是指示发生错误的常用方法。您可以通过实现Exception接口来定义自定义异常:
class CustomException implements Exception{
final String msg = 'hjk';
const CustomException([msg]);
@override
String toString() {
return super.toString();
}
}