2008-11-13 97 views
49

我有一个怀疑,我使用的finally块错误,而且我不明白它的目的基本面...JavaScript错误与尝试处理..赶上..终于

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

此函数将运行catch块,提醒“出现错误”,但返回true。为什么它不会返回错误?

回答

81

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

finally块将始终运行,试试你的try块后回到true当你离开try块

function myFunc() { 
    try { 
     if (true) { 
       throw "An error"; 
      } 
      return true; 
    } catch (e) { 
      alert (e); 
      return false; 
    } finally { 
      //do cleanup, etc here 
    } 
} 
10

最后块执行。在你的代码中,这发生在你返回false时。这将返回值设置为false并尝试退出该函数。但首先它必须退出触发finally的try块,并将返回值覆盖为true。

许多人认为,每个函数都有一个单一的return语句是一种很好的编程习惯。考虑在你的函数开始处做一个var retval,并在整个函数中将它设置为true或false,然后构造代码,使其正确地落到底部的单个返回。浏览器的控制台上

+16

使用单一返回值是解决简化函数意图和清晰度问题的一种有效且有用的策略。使用变量来存储返回值也是解决复杂的返回值逻辑的有效手段。但是,我不认为可以这样说,函数中的多个return语句会自动表示不好的编程实践。在很多情况下,这样做很好:编写代码更简单,并且将函数的意图传达给需要了解它的下一位程序员。 `函数a(i){if(i === undefined){return;} ...}' – ErikE 2011-04-04 19:42:44

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); 

运行这一点,它可能给你你正在寻找的答案。