代码之家  ›  专栏  ›  技术社区  ›  gib

试一试,接住,最后-奇怪的行为?

  •  1
  • gib  · 技术社区  · 6 年前

    我不明白为什么:

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

    给我这个:

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

    我会怀疑,我应该 err2 . 我知道 finally {} 是否始终执行 try {} 是否成功,但为什么例外来自 最后{} 在中的异常之前返回 catch {} ?

    2 回复  |  直到 6 年前
        1
  •  2
  •   str    6 年前

    这就是 ECMAScript specification :

    TryStatement: try Block Catch Finally

    1. B 是评估块的结果。
    2. 如果 B.[[type]] 是扔,然后
      • C be catchClauseEvaluation of catch with参数 B.[[value]] .
    3. 否则 B[ [类型] ] 不是投掷,让 C .
    4. F
    5. 如果 F.[[type]] 正常,让 F C .
    6. 如果 F[ [类型] ] 是返回,还是 F.[[类型]] 是投掷,返回 Completion(F) .

    […]

    这可能是不平凡的阅读。但其要点是 catch 块被分配给 C . 但是如果 finally 返回任何内容或 throws , C 被忽略,结果 最后 而是返回。

        2
  •  0
  •   Alex    6 年前

    throw 不是瞬间的事情。当你没有一个 finally 但块 最后 有能力改变你的 (也可以更改您的返回值!)直到函数实际结束,才处理该值。(有一些线程终止等例外)