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 对于静态资源异常,接口异常,都捕获不到。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以下:跨域
<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}`;
}
复制代码