抛出JS后继续执行

时间:2012-03-19 22:55:56

标签: 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(){...});  

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

7 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:8)

通常,当您手动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

答案 2 :(得分:1)

你正在寻找try-catch吗?

答案 3 :(得分:1)

如果您尝试聚合所有错误而不是仅抛出其中一个错误,那么您应该创建一个问题数组(例外),然后抛出数组,而不仅仅是您遇到的第一个问题。

答案 4 :(得分: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", {} );

答案 5 :(得分:1)

如果您想报告捕获的错误以便DataRaw将触发,您可以在catch块中调度错误事件:

DataRaw

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

答案 6 :(得分:0)

如果你想要很好地处理它们,你需要catch抛出错误。在您的示例中:

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

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