2017-07-22 107 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;