try{
var a = 1;
var c = a + b;
console.log(c)
}catch(e){
console.log(e) //ReferenceError: b is not defined
}
複製代碼
window.onerror = function(errorMessage, scriptURI, lineNo, columnNo, error){
console.log('errorMessage: ' + errorMessage); // 異常信息
console.log('scriptURI: ' + scriptURI); // 異常文件路徑
console.log('lineNo: ' + lineNo); // 異常行號
console.log('columnNo: ' + columnNo); // 異常列號
console.log('error: ' + error); // 異常堆棧信息
};
console.log(a);
複製代碼
結果以下: javascript
window.onerror即提供了咱們錯誤的信息,還提供了錯誤行列號,能夠精準的進行定位注意:window.onerror 對於靜態資源異常,接口異常,都捕獲不到。html
window.onerror = function(messsage, source, lineno, colno, error){
console.log('捕獲到異常:',{
messsage, source, lineno, colno, error
})
}
setTimeout(function(){
undefined.map(v=>v)
},1000)
複製代碼
輸出: java
注意:onerror 最好寫在全部 JS 腳本的前面,不然有可能捕獲不到錯誤;webpack
<script> window.addEventListener('error',error=>{ console.log('捕獲到異常:',error) },true) </script>
<img src="./xxx/png" />
複製代碼
因爲網絡請求異常不會事件冒泡,所以必須在捕獲階段將其捕捉到才行,可是這種方式雖然能夠捕捉到網絡請求的異常,可是沒法判斷 HTTP 的狀態是 404 仍是其餘好比 500 等等,因此還須要配合服務端日誌才進行排查分析才能夠。web
注意:不一樣瀏覽器下返回的 error 對象可能不一樣,須要注意兼容處理。須要注意避免 addEventListener 重複監聽。ajax
<script src="http://cdn.xxx.com/index.js"></script>
複製代碼
如今把js文件放到跨域的cdn上面,運行訪問:http://localhost/8000以下:跨域
通過分析發現,跨域以後window.onerror是沒法捕獲異常信息的,因此統一返回Script error.,解決方案即是script屬性配置 crossorigin=」anonymous」 而且服務器添加Access-Control-Allow-Origin。<script src="http://cdn.xxx.com/index.js" crossorigin="anonymous"></script>
複製代碼
加上crossorigin=」anonymous」後如圖: promise
解決跨域或者將腳本存放在同域以後,你可能會將代碼壓縮一下再發布,這時候便出現了壓縮後的代碼沒法找到原始報錯位置的問題。如圖,咱們用webpack將代碼打包壓縮成bundle.js: 瀏覽器
解決辦法:在webpack配置中加入devtool: '#source-map'。服務器
function report(error) {
let reportUrl = 'http://jartto.wang/report';
new Image().src = `${reportUrl}?logs=${error}`;
}
複製代碼