如何在JavaScript中执行catch命令?

时间:2018-02-14 10:57:06

标签: javascript try-catch

鉴于 test 函数,为什么首先执行 finally 代码中的代码而不是 try 块中的代码?如果是这样,变量 a 的新值为5(来自第9行),然后应该有一个新值8(来自第4行)。但它没有, a 的值是6.不知何故只有日志是从 finally 块执行的,并且分配被忽略了?在 try-catch 块中使用 return 是一种不好的做法?我看到,在许多流行的框架中,catch和finally块都缺少 return 语句。

1    function test () {
2      window['a'] = 3; 
3      try {
4        window['a'] += 3;
5        return window['a'];
6      } 
7      catch(e) {} 
8      finally { 
9        window['a'] = 5;
10       console.log('finally');
11      }
12    }
13
14    console.log(test());

段:

function test() {
  window['a'] = 3;
  try {
    window['a'] += 3;
    return window['a'];
  } catch (e) {} finally {
    window['a'] = 5;
    console.log('finally');
  }
}

console.log(test());

预期输出

  

6

     

最后

执行输出

  

最后

     

6

2 个答案:

答案 0 :(得分:1)

执行顺序为TRY,然后是CATCH,然后是FINALLY(照例)。

您正在返回try块中的值,这就是您输出该值的原因。

执行try块,然后执行最后一个(因为没有错误),并记录您的消息,然后返回函数结果。

如果你把console.log(window ['a'])而不是return,你会看到你的预期输出。

答案 1 :(得分:1)

在正常执行过程中,finally保证try块后执行。如果在try块中抛出异常,则顺序为try - > catch - >最后。在你的代码中,即使我们有一个return语句作为try块中的最后一行,finally块也会在退出方法之前执行。

如果当前线程在try块仍在运行时被终止,那么finally块将不会被执行的示例。

编辑:来自ECMAScript 2015语言规范部分13.15.8

TryStatement : try Block Finally
Let B be the result of evaluating Block.
Let F be the result of evaluating Finally.
If F.[[type]] is normal, let F be B.
If F.[[type]] is return, or F.[[type]] is throw, return Completion(F).
If F.[[value]] is not empty, return Completion(F).
Return Completion{[[type]]: F.[[type]], [[value]]: undefined, [[target]]: F.[[target]]}.

因此,如果finally块正常执行,try-finally块的结果保持不变。这就是finally块仅应用于清理任务的原因,它不应包含任何业务逻辑。