2012-03-19 88 views
1

我在我的代码中使用了这个函数,并且我使用throw来创建有意义的错误(而不是默默地失败)。但是,当我以这种方式构建我的功能时,如果我在调用defineSandbox()时发生错误,它会停止整个脚本。在投掷JS后继续执行

//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(){...}); 

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

回答

5

通常情况下,您不希望在手动执行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

1

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

0

您需要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", {}); 
4

console.error()不会引发错误,但会在日志中显示错误而不会暂停执行。

0

如果您想报告的陷入错误,以便window.onerror会火,你可以在你的catch块分派一个错误事件:

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

我发现这个有用的用于捕捉和报告错误的for循环同时仍然继续循环。