Dart学习笔记:异常

Dart 和 Java 不同的是,所有的 Dart 异常是非检查异常。 方法不声明他们可能抛出的异常, 并且你不被要求捕获任何异常。

Dart 提供了 ExceptionError 类型, 以及许多预定义的子类型。你还可以定义自己的异常类型。

Throw

Dart 不仅仅可以抛出Exception或者Error对象,还可以抛出任何非null对象为异常。

throw new FormatException('Expected at least 1 section');

throw 'Out of llamas!';

Catch

捕获异常可以避免异常继续传递(你重新抛出异常除外)。 捕获异常给你一个处理该异常的机会。

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  buyMoreLlamas();
}

对于可以抛出多种类型异常的代码,你可以指定多个捕获语句。每个语句分别对应一个异常类型, 如果捕获语句没有指定异常类型,则该可以捕获任何异常类型:

try {
  breedMoreLlamas();
} on OutOfLlamasException {
  // A specific exception
  buyMoreLlamas();
// e为异常对象,s为调用堆栈信息
} on Exception catch (e, s) {
  // Anything else that is an exception
  print('Unknown exception: $e');
} catch (e) {
  // No specified type, handles all
  print('Something really unknown: $e');
}

使用 rethrow 关键字可以把捕获的异常重新抛出。

final foo = '';

void misbehave() {
  try {
    foo = "You can't change a final variable's value.";
  } catch (e) {
    print('misbehave() partially handled ${e.runtimeType}.');
    rethrow; // Allow callers to see the exception.
  }
}

Finally

要确保某些代码执行,不管有没有出现异常都需要执行,可以使用 一个 finally 语句来实现。如果没有 catch 语句来捕获异常, 则在执行完 finally 语句后, 异常还是会被抛出。

try {
  breedMoreLlamas();
} finally {
  // Always clean up, even if an exception is thrown.
  cleanLlamaStalls();
}

try {
  breedMoreLlamas();
} catch(e) {
  print('Error: $e');  // Handle the exception first.
} finally {
  cleanLlamaStalls();  // Then clean up.
}