Dart语言基础之异常

原文:https://www.dartlang.org/guides/language/language-tour

异常

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');
}

如前面的代码所示,您可以使用oncatch或两者。 需要指定异常类型时,请使用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

你可能感兴趣的:(Dart语言基础之异常)