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)
我想要的是,如果一个调用失败,它会发出错误但仍尝试继续运行该脚本.我如何构造这个代码,以便我可以实现这一点?
通常,您不希望在手动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 error或reference error类似错误
throw new TypeError();
throw new ReferenceError();
throw new SyntaxError();
etc.
Run Code Online (Sandbox Code Playgroud)
完整清单:MDN
如果您想报告捕获的错误以便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 循环中的错误非常有用,同时仍然继续循环。