假设我们有这个Dart代码:
void main() {
try {
try {
throw null;
} catch(e) {
throw null;
} finally {
print('first');
}
} finally {
print('second');
}
}
在浏览器中运行此代码时
非常期待产生的结果。
first
second
Uncaught Throw of null.
但是如果在Dart VM中运行此代码,则结果非常意外。
second
Unhandled exception: Throw of null.
这看起来好像第一个终止块(finally
)永远不会被执行。
我无法理解异常处理机制的这种行为。
当然,我们可以假设这是一个错误。 但异常处理是任何系统的基石。 Dart开发人员如何解释这种差异?
P.S。
我认为这个问题与“关于编程”的主题相关,并且在这里提出它是正确的地点和时间吗?
答案 0 :(得分:3)
据我所知,这似乎是VM中的错误。我提交了一个错误:
https://code.google.com/p/dart/issues/detail?id=11758&thanks=11758&ts=1373396821
我应该补充说,虽然代码说明了不同的VM和dart2js实现,但它有点容易出错。如果您认为您的catch
块将要抛出,请将catch
块内的代码包装在其自己的try-catch
中。
而且,是的,我同意这是一个在StackOverflow上提出的好问题。感谢您发布此内容。