55

我怀疑我finally错误地使用了该块,并且我不了解其用途的基本原理...

 function myFunc() {
      try {
           if (true) {
                throw "An error";
           }
      } catch (e) {
           alert (e);
           return false;
      } finally {
           return true;
      }
 }

此函数将运行该catch块,警告“错误”,但随后返回 true。为什么它不返回假?

4

3 回答 3

84

finally 块包含要在 try 和 catch 块执行之后但在 try...catch 语句之后的语句之前执行的语句。无论是否抛出异常,finally 块都会执行。如果抛出异常,即使没有 catch 块处理异常,finally 块中的语句也会执行。更多的

finally块将始终运行,尝试true在您的try块后返回

function myFunc() {
     try {
         if (true) {
               throw "An error";
          }
          return true;
     } catch (e) {
          alert (e);
          return false;
     } finally {
          //do cleanup, etc here
     }
 }
于 2008-11-13T05:11:29.000 回答
10

finally 块在您离开 try 块时执行。在您的代码中,当您返回 false 时会发生这种情况。这会将返回值设置为 false 并尝试退出该函数。但首先它必须退出触发 finally 并将返回值覆盖为 true 的 try 块。

许多人认为每个函数有一个返回语句是一种很好的编程习惯。考虑在函数的开头创建一个 var retval,并在整个函数中根据需要将其设置为 true 或 false,然后构建代码,使其正确地落入底部的单个 return。

于 2008-11-13T05:42:10.060 回答
1
function getTheFinallyBlockPoint(someValue) {
    var result;
    try {
        if (someValue === 1) {
            throw new Error("Don't you know that '1' is not an option here?");
        }
        result = someValue
    } catch (e) {
        console.log(e.toString());
        throw e;
    } finally {
        console.log("I'll write this no matter what!!!");
    }

    return result;
};

getTheFinallyBlockPoint("I wrote this only because 'someValue' was not 1!!!");
getTheFinallyBlockPoint(1);

在浏览器的控制台上运行它,它可能会为您提供您正在寻找的答案。

于 2015-01-27T08:13:35.483 回答