2012-03-19 124 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循環同時仍然繼續循環。