投入尝试,抓住,最后-奇怪的行为?

时间:2018-12-04 21:06:43

标签: javascript try-catch

我不明白为什么这样:

try {
    throw 'err1';
} catch {
    throw 'err2';
} finally {
    throw 'err3';
}

给我这个:

$ node try.js

/try.js:6
    throw 'err3';
    ^
err3

我会怀疑我应该得到err2。我知道finally {}总是执行,无论try {}是否成功,但是为什么在finally {}中的异常之前返回catch {}的异常?

2 个答案:

答案 0 :(得分:2)

这是ECMAScript specification定义的行为:

  

TryStatement:try Block Catch Finally

     
      
  1. B是评估Block的结果。
  2.   
  3. 如果抛出B.[[type]],则      
        
    • C为具有参数B.[[value]]的CatchClauseEvaluation。
    •   
  4.   
  5. 不抛出其他B.[[type]],让CB
  6.   
  7. F是“最终”评估的结果。
  8.   
  9. 如果F.[[type]]正常,则将F设为C
  10.   
  11. 如果返回F.[[type]]或抛出F.[[type]],则返回Completion(F)
  12.   
     

[...]

阅读起来可能很简单。但要点是catch块的结果已分配给C。但是,如果finally返回任何内容或throws,则C被忽略,而返回finally的结果。

答案 1 :(得分:0)

throw不是瞬间的事情。当您没有finally块但finally可以更改您的throw(它也可以更改您的返回值!)和该值时,很容易感觉到它在函数实际结束之前不会处理。 (线程终止等例外)