在JS中,在throw之后继续执行

14
我在代码中有这个函数,我使用throw来创建有意义的错误(而不是默默失败)。 然而,当我以这种方式构建我的函数时,如果我用一个错误调用defineSandbox(),它会停止整个脚本。
//defineSandbox is in an object, for now i name "myObj"

var defineSandbox = function (sandboxName,SandboxDefinition) {

    //validation
    if(!is.validString(sandboxName)) {
        throw statusMessages.sandbox.invalidName;
    }
    if(!is.validFunction (SandboxDefinition)) {
        throw statusMessages.sandbox.invalidDefinition;
    }

    //...some more validation here

    //...sandbox builder code if validation passes (code wasn't returned)

    registered.sandboxes[sandboxName] = newSandbox;
};

//intentional error, non-string name
myObj.defineSandbox(false);                        

//...and so the rest of the script from here down is not executed  

//i can't build this sandbox anymore
myObj.defineSandbox('mySandbox',function(){...});  

我希望的是,如果一个调用失败了,它会输出一个错误,但仍然尝试继续运行脚本。如何构建这段代码,以便我可以实现这一点?

7个回答

19

通常情况下,当您手动throw一个新错误时,您不希望继续执行。如果您想要记录此错误,应该考虑自己创建一个内部解决方案。

但是,为了捕获一个抛出的错误,您需要调用一个try/catch语句。

try {
    myObj.defineSandbox(false); 
} catch( ex ) {
    // execution continues here when an error was thrown. You can also inspect the `ex`ception object
}

顺便提一下,你也可以指定要抛出的错误类型,例如 type errorreference error

throw new TypeError();
throw new ReferenceError();
throw new SyntaxError();
etc.

完整列表:MDN


@Tylor 这个回答为什么不符合问题要求? - jAndy

14

console.error()不会抛出错误,但会在您的日志中显示错误信息而不会停止执行。


5

如果您想报告捕获的错误以便触发window.onerror,您可以在catch块中分派一个错误事件:

try {
}
catch (error)
{
    const e = new ErrorEvent('error', {message:'my error', error:error})
    window.dispatchEvent(e)
}

我发现这对于在for循环中捕获和报告错误,同时仍然继续执行循环很有用。

2
如果您想汇总所有错误而不仅仅是抛出其中一个,那么您应该创建一个问题(异常)数组,然后抛出该数组,而不是只抛出第一个遇到的问题。

1

如果你想要优雅地处理错误,就需要在代码中使用 catch 来捕获抛出的异常。以你的示例为例:

//intentional error, non-string name
try {
    myObj.defineSandbox(false);
} catch(error) {
   alert("Error defining sandbox: " + error);
}

然后随后的代码仍将继续运行。


1
var bear = {};
(function () {
    bear.errorProcesser = function  ( e ) {
        console.log( e );
    }
    bear.define = function  ( name, fn  ) {
        try {
            if( typeof name != "string" || typeof fn != "function"){
                throw new Error ("some error");
            }
            bear[name] = fn;
        } catch (e){
            bear.errorProcesser ( e );
        }
    }
})()
bear.define ( "testfunc", {} );

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接