1

假设我们有这个 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 开发人员如何解释这种差异?

附言

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

4

1 回答 1

3

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

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

我应该补充一点,虽然代码说明了不同的 VM 和 dart2js 实现,但它有点容易出错。如果你觉得你catch的代码块会被抛出,请将代码catch块内的代码包装在它自己的try-catch.

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

于 2013-07-09T19:12:08.380 回答