异常
Dart代码可以抛出或捕获异常. 如果未捕获异常,If the exception isn’t caught, the isolate that raised the exception is suspended, and typically the isolate and its program are terminated.
有别于Java, Dart的所有异常都是非检查类型异常.方法不会声明它们可能引发的异常,并且您不需要捕获任何异常。
Dart 提供 Exception 和 Error 类型, 以及许多预定义的子类型。亦可以自定义异常. 然而,Dart程序可以抛出任何非null对象 - 不仅仅是Exception和Error对象 - 作为Exception。
Throw
59/5000
以下是抛出或引发异常的示例:
throw FormatException('Expected at least 1 section');
你也可以抛出任意对象:
throw 'Out of llamas!';
Note: Production-quality code usually throws types that implement Error or Exception.
因为抛出异常是一个表达式,所以可以在=>语句中以及允许表达式的任何其他地方抛出异常:
void distanceTo(Point other) => throw UnimplementedError();
Catch
捕获或捕获异常会阻止异常传播(除非您重新抛出异常), 捕获异常使您有机会处理它:
try {
breedMoreLlamas();
} on OutOfLlamasException {
buyMoreLlamas();
}
要处理可能抛出多种类型异常的代码,可以指定多个catch子句。 与抛出对象的类型匹配的第一个catch子句处理异常。 如果catch子句未指定类型,则该子句可以处理任何类型的抛出对象:
try {
breedMoreLlamas();
} on OutOfLlamasException {
// A specific exception
buyMoreLlamas();
} on Exception catch (e) {
// Anything else that is an exception
print('Unknown exception: $e');
} catch (e) {
// No specified type, handles all
print('Something really unknown: $e');
}
如前面的代码所示,您可以使用on
或catch
或两者。 需要指定异常类型时,请使用on
。 当异常处理程序需要异常对象时,请使用catch
。
您可以为catch()
指定一个或两个参数。 第一个是抛出的异常,第二个是堆栈跟踪([StackTrace](https://api.dartlang.org/stable/dart-core/StackTrace-class.html)对象)。
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++); // Runtime error
} catch (e) {
print('misbehave() partially handled ${e.runtimeType}.');
rethrow; // Allow callers to see the exception.
}
}
void main() {
try {
misbehave();
} catch (e) {
print('main() finished handling ${e.runtimeType}.');
}
}
Finally
无论是否抛出异常,要确保某些代码运行,请使用finally子句。 如果没有catch子句与异常匹配,则在finally子句运行后传播异常:
try {
breedMoreLlamas();
} finally {
// Always clean up, even if an exception is thrown.
cleanLlamaStalls();
}
finally子句在任何匹配的catch子句之后运行:
try {
breedMoreLlamas();
} catch (e) {
print('Error: $e'); // Handle the exception first.
} finally {
cleanLlamaStalls(); // Then clean up.
}
更多请看 Exceptions
网友评论