了解Dart中的异常处理机制(控制流)

时间:2013-07-09 16:20:15

标签: dart

假设我们有这个Dart代码:

void main() {
  try {
    try {
      throw null;
    } catch(e) {
      throw null;
    } finally {
      print('first');
    }
  } finally {
    print('second');
  } 
}

通过http://try.dartlang.org

在浏览器中运行此代码时

非常期待产生的结果。

first
second
Uncaught Throw of null.

但是如果在Dart VM中运行此代码,则结果非常意外。

second
Unhandled exception: Throw of null.

这看起来好像第一个终止块(finally)永远不会被执行。

我无法理解异常处理机制的这种行为。

当然,我们可以假设这是一个错误。 但异常处理是任何系统的基石。 Dart开发人员如何解释这种差异?

P.S。

我认为这个问题与“关于编程”的主题相关,并且在这里提出它是正确的地点和时间吗?

1 个答案:

答案 0 :(得分:3)

据我所知,这似乎是VM中的错误。我提交了一个错误:

https://code.google.com/p/dart/issues/detail?id=11758&thanks=11758&ts=1373396821

我应该补充说,虽然代码说明了不同的VM和dart2js实现,但它有点容易出错。如果您认为您的catch块将要抛出,请将catch块内的代码包装在其自己的try-catch中。

而且,是的,我同意这是一个在StackOverflow上提出的好问题。感谢您发布此内容。