我在我的代码中有这个功能,我正在使用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(){...});
我想要的是,如果一个调用失败,它会发出错误但仍尝试继续运行该脚本。我如何构建这个代码,以便我可以实现这一点?
答案 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 error
或reference 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);
}
然后后续代码仍将继续运行。