你的Dart代码可以抛出和捕捉异常。异常是错误,表示发生了意外的事情。如果没有捕获到异常,引发异常的隔离会挂起,通常隔离及其程序会终止。
与Java不同,Dart的所有异常都是未经检查的异常。方法不声明它们可能抛出哪些异常,也不要求你捕捉任何异常。
Throw
下面是一个抛出异常的例子:
throw FormatException('Expected at least 1 section');
还可以抛出任意对象:
throw 'Out of llamas!';
注意:生产质量代码通常抛出实现
Error
或Exception
的类型
因为抛出异常是一个表达式,您可以在=>
语句以及任何其他允许表达式的地方抛出异常:
void distanceTo(Point other) => throw UnimplementedError();
Catch
捕捉异常会阻止异常传播(除非您重新搜索异常)。捕捉异常让你有机会处理它:
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}
要处理可能引发多种类型异常的代码,可以指定多个catch子句。匹配抛出对象类型的第一个catch子句处理异常。如果catch子句未指定类型,则该子句可以处理任何类型的抛出对象:
try {
breedMoreLlamas();
} on OutOfLlamasException {
// 一个指定的异常
buyMoreLlamas();
} on Exception catch (e) {
// 捕获任意一个异常
print('Unknown exception: $e');
} catch (e) {
// 没有指定类型,处理所有
print('Something really unknown: $e');
}
正如前面的代码所示,你可以使用on
或catch
,或者两者都使用。需要指定异常类型时使用on
。当需要处理异常对象时,使用catch
。
你可以指定一两个参数在catch()
上。第一个是抛出的异常,第二个是堆栈跟踪( StackTrace对象)。
try {
// ···
} on Exception catch (e) {
print('Exception details:\n $e');
} catch (e, s) {
print('Exception details:\n $e');
print('Stack trace:\n $s');
}
要部分处理异常,同时允许它传播,请使用rethrow
关键字。
void misbehave() {
try {
dynamic foo = true;
print(foo++); // 运行时错误
} catch (e) {
print('misbehave() partially handled ${e.runtimeType}.');
rethrow; // 允许调用者看到异常
}
}
void main() {
try {
misbehave();
} catch (e) {
print('main() finished handling ${e.runtimeType}.');
}
}
Finally
为了确保无论是否抛出异常,一些代码都会运行,请使用finally子句。如果没有catch子句匹配异常,则在finally子句运行后传播异常:
try {
breedMoreLlamas();
} finally {
// 永远都会执行清理,即使抛出异常
cleanLlamaStalls();
}
finally子句在任何匹配的catch子句之后运行:
try {
breedMoreLlamas();
} catch (e) {
print('Error: $e'); // 首先处理异常。
} finally {
cleanLlamaStalls(); // 然后执行清理
}
PS:本文
整理
自官方文档,若有发现问题请致邮 caoyanglee92@gmail.com