Dart学习-异常

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容