2017-07-22 133 views
0

我正在使用window.error嘗試捕獲所有客戶端錯誤。Javascript捕獲錯誤

它與JavaScript錯誤工作正常,但它並沒有捕獲像網絡錯誤或AJAX錯誤的所有錯誤。

這是我的代碼(我不能使用jQuery,所以無法使用.ajaxError):

window.onerror = function(messageOrEvent, source, lineno, colno, error) { 
    console.log("Captured: " + messageOrEvent) 
} 

這是結果: enter image description here

任何人都知道的方式捕獲客戶端的所有錯誤?

感謝

+0

如果ajax調用jQuery可能會{錯誤:err =>拋出err} –

+0

我必須做到全局。我無法編輯每一個功能。無論如何謝謝:) –

+0

可能會覆蓋一些XMLHttpRequest.prototype函數。 –

回答

1

也許鉤住默認請求對象:

(function(orig){ 
    window.XMLHttpRequest=function(...args){ 
    var instance=new orig(...args); 
    instance.addEventListener("readyStateChange",function(){ 
    if(instance.status!==200){ 
     throw new Error(instance.status+":"+instance.statusText); 
    } 
    }); 
    return instance; 
}; 
})(XMLHttpRequest); 
+0

非常感謝。這是我正在尋找的。什麼是沉浸在...參數? –

+0

@marcos Aguayo與.apply(參數)相同,看看* rest參數* –

0

我已經找到一種方法。這是我的代碼。我認爲這會捕獲所有錯誤。

// JavaScript Errors 
    window.onerror = function(messageOrEvent, source, lineno, colno, error) { 
     console.log("Captured: " + messageOrEvent) 
    } 

    // 404 FILES 
    window.addEventListener('error', function(e) { 
     console.log(e); 
    }, true); 

    // AJAX Errors 
    var open = window.XMLHttpRequest.prototype.open, 
     send = window.XMLHttpRequest.prototype.send; 

    function openReplacement(method, url, async, user, password) { 
     this._url = url; 
     return open.apply(this, arguments); 
    } 

    function sendReplacement(data) { 
     if(this.onreadystatechange) { 
     this._onreadystatechange = this.onreadystatechange; 
     } 
     this.onreadystatechange = onReadyStateChangeReplacement; 
     return send.apply(this, arguments); 
    } 

    function onReadyStateChangeReplacement() { 

     // CAPTURE HERE. 
     if(this.status != 200){ 
     console.log(this.responseURL + " " + this.status + " " + this.statusText); 
     } 

     if(this._onreadystatechange) { 
     return this._onreadystatechange.apply(this, arguments); 
     } 
    } 

    window.XMLHttpRequest.prototype.open = openReplacement; 
    window.XMLHttpRequest.prototype.send = sendReplacement;