Dart学习-异常

作者: 你需要一台永动机 | 来源:发表于2018-10-22 15:06 被阅读6次
    Dart

    你的Dart代码可以抛出和捕捉异常。异常是错误,表示发生了意外的事情。如果没有捕获到异常,引发异常的隔离会挂起,通常隔离及其程序会终止。

    与Java不同,Dart的所有异常都是未经检查的异常。方法不声明它们可能抛出哪些异常,也不要求你捕捉任何异常。


    Throw

    下面是一个抛出异常的例子:

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

    还可以抛出任意对象:

    throw 'Out of llamas!';
    

    注意:生产质量代码通常抛出实现ErrorException的类型

    因为抛出异常是一个表达式,您可以在=>语句以及任何其他允许表达式的地方抛出异常:

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

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

    相关文章

      网友评论

        本文标题:Dart学习-异常

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