2017-03-07 24 views
0

我試圖將所有我的Javascript異常以及未處理的異常一起發送到服務器進行日誌記錄。我已經通過window.onerror documentationalso this post瞭解了這個問題,但它們只適用於未處理的異常。向服務器發送已處理的(不只是未處理的)Javascript錯誤

window.onerror如果異常已在catch()塊中處理,則不會觸發。

一個'痛苦'的方法是將我的logToServer()函數手動附加到我的代碼中的每個catch()塊(它也可以),但我希望有更好的解決方案。

我已經在下面設置了一小段代碼。只有

var logToServer = function logToServer() { 
 
    console.info('logToServer() called'); 
 
}; 
 
window.onerror = function(z, x, c, v, b) { 
 
    console.info(z); 
 
    console.info(x); 
 
    console.info(c); 
 
    console.info(v); 
 
    console.info(b); 
 

 
    // call a function to send to server 
 
    logToServer(); 
 
}; 
 
window.addEventListener('error', function(z, x, c, v, b) { 
 
    console.info(z); 
 

 
    // call a function to send to server 
 
    logToServer(); 
 
}); 
 

 
// test w/o catch-block 
 
//console.info(err); // calls logToServer() 
 

 
// test w/ catch-block 
 
try { 
 
    console.info(asd); // does not call logToServer() 
 
} catch (err) { 
 
    console.error(err); 
 
};
Enable logs in console.

+0

對於已處理的異常,請執行您的邏輯,然後在最後從catch塊中拋出您的異常。 –

+0

爲什麼?無論您使用* try ... catch *來處理您無法避免的錯誤,那麼這些錯誤都會被處理*(並且不應該有這樣的錯誤發生的地方)*。或者,您可以在任何地方使用* try .. catch *來處理蹩腳的錯誤代碼,並避免用戶看到這些錯誤或其後果。在這種情況下,請停止捕獲這些錯誤並修復導致它們的代碼。再說一遍,爲什麼你有這麼多的*嘗試... catch *塊在你的代碼中,你發現手動添加日誌很麻煩?爲什麼要記錄(服務器端)每個已經處理的錯誤? – Thomas

+0

@MuhammadQasim - 你的意思是手動編輯每個catch塊,並拋出異常時調用我的邏輯?我可以做到這一點,但訪問每個catch塊似乎是一個矯枉過正。更不用說總是要確保將來任何新的try catch塊都應該總是調用我的服務器日誌邏輯函數。你的意思是別的嗎? – Rodiwa

回答

0

window.onerror火災時,異常是未處理的。如果您發現任何異常,此事件不會觸發。你必須在所有try-catch塊中明確地做到這一點。在catch塊中,你將不得不拋出你的異常。語法很簡單:

try{ 
    //Your try logic 
} 
catch(ex){ 
    // Your catch logic comes here 
    throw ex; //This will throw exception and window.onerror will be fired. 
}