如果我在“catch”中使用“throw”怎么办?

时间:2014-02-27 13:09:59

标签: javascript

function f(){
    try{
        if (/*some codes*/) throw false;
        return true;
    }
    catch(x){
        if (x===false) return false;
        throw x;
    }
}

这里,“抛出x”是什么意思?似乎“catch”中的代码不会运行两次。

4 个答案:

答案 0 :(得分:2)

这意味着它会将异常抛出到调用函数,该函数将执行其catch块,以防定义了一个。

例如,在下面的代码中,您在callthis()函数中记录异常,但您希望调用函数(init())决定如何处理它。因此,你重新抛出异常,它会冒泡。

window.onload = init();
function init(){
    try {
        callthis();
    } catch(e) {
        alert('init - calling function');
    }
}

function callthis(){
    try {
        var x = null.split(','); //inducing an error
    } catch(e){
        alert('callthis - called function');
        throw e;
    }
}

Fiddle

答案 1 :(得分:2)

如果你有类似的话:

try {
    try {
        //something
    } catch(x) {
        throw x;
    }
} catch(x) {
    //handle it
}

内部catch的抛出会导致外部catch执行

答案 2 :(得分:1)

当您在Javascript中有try/catch块时,catch块将会在try块中发生任何错误。关键字throw用于向上级范围(调用函数的样本)抛出错误,传递catch块将要执行的错误(异常)。在catch中,您可以将异常作为第一个参数。在您的代码中,使用throw x获取错误,其中x是例外。调用者将获取x作为catch块的参数。

function K()
{
   try
   {
      f();
   }
   catch(ex)
   {
      // handle any exception thrown by f();
   }    
}

答案 3 :(得分:1)

这是你捕获异常并将其冒充堆栈供用户处理的方式。

我不想看到这段代码。您已经捕获了异常并将返回值设置为false。为什么抛出异常?让用户检查返回值并决定下一步做什么。你的catch块没有任何用处。

如果你遇到异常,你应该考虑处理它,不应该重新抛出它。唯一的例外是将已检查的异常包装为未选中。

如果你无法处理它,并且日志记录不被视为处理,我宁愿将throws子句添加到方法签名中,让它冒出方法。