我不明白为什么这样:
try {
throw 'err1';
} catch {
throw 'err2';
} finally {
throw 'err3';
}
给我这个:
$ node try.js
/try.js:6
throw 'err3';
^
err3
我会怀疑我应该得到err2
。我知道finally {}
总是执行,无论try {}
是否成功,但是为什么在finally {}
中的异常之前返回catch {}
的异常?
答案 0 :(得分:2)
这是ECMAScript specification定义的行为:
TryStatement:
try Block
Catch
Finally
- 让
B
是评估Block的结果。- 如果抛出
B.[[type]]
,则
- 让
C
为具有参数B.[[value]]
的CatchClauseEvaluation。- 不抛出其他
B.[[type]]
,让C
为B
。- 让
F
是“最终”评估的结果。- 如果
F.[[type]]
正常,则将F
设为C
。- 如果返回
F.[[type]]
或抛出F.[[type]]
,则返回Completion(F)
。[...]
阅读起来可能很简单。但要点是catch
块的结果已分配给C
。但是,如果finally
返回任何内容或throws
,则C
被忽略,而返回finally
的结果。
答案 1 :(得分:0)
throw
不是瞬间的事情。当您没有finally
块但finally
可以更改您的throw
(它也可以更改您的返回值!)和该值时,很容易感觉到它在函数实际结束之前不会处理。 (线程终止等例外)