美文网首页
Dart语言基础之异常

Dart语言基础之异常

作者: 星空下奔跑 | 来源:发表于2019-04-04 23:55 被阅读0次

    原文: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 提供 ExceptionError 类型, 以及许多预定义的子类型。亦可以自定义异常. 然而,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语言基础之异常

          本文链接:https://www.haomeiwen.com/subject/ofmtiqtx.html