抛出JS后继续执行

Jos*_*eph 4 javascript error-handling

我在我的代码中有这个功能,我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(){...});  
Run Code Online (Sandbox Code Playgroud)

我想要的是,如果一个调用失败,它会发出错误但仍尝试继续运行该脚本.我如何构造这个代码,以便我可以实现这一点?

jAn*_*ndy 9

通常,您不希望在手动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
}
Run Code Online (Sandbox Code Playgroud)

顺便说一下,您还可以指定要抛出的错误类型,例如a type errorreference error类似错误

throw new TypeError();
throw new ReferenceError();
throw new SyntaxError();
etc.
Run Code Online (Sandbox Code Playgroud)

完整清单:MDN


小智 9

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


Mar*_*ark 5

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

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

我发现这对于捕获和报告 for 循环中的错误非常有用,同时仍然继续循环。