window.onerror
浏览器提供的错误处理API,当JavaScript运行时错误(包括语法错误)发生时触发
若该函数返回true,则阻止执行默认事件处理函数。
/**
message:错误信息(字符串)。可用于HTML ""处理程序中的event。
source:发生错误的脚本URL(字符串)
lineno:发生错误的行号(数字)
colno:发生错误的列号(数字)
error:Error对象(对象)
**/
window.onerror = function(message, source, lineno, colno, error) {
}
// 捕获阶段
window.addEventListener('error', function (e) {
},true);
iframe
可控的iframe 也可以使用onerror获取错误信息,但是第三方iframe 无法获取
iframe 页面和你的主站是同域名的话,直接给 iframe 添加 onerror 事件即可
不是同域名但是可控的页面可以通过与 iframe 通信的方式将异常信息抛给主站接收
问题
可以获取详细信息,①但是现在js全都是压缩过的,无法获取正常的数据,②而且不同域的Javascript文件,通过window.onError无法获取有效的错误信息,必须要再资源的http头上加上 Access-Control-Allow-Origin:
,并在脚本上加上 crossorigin
属性。③并且资源加载错误,必须在捕获阶段将其捕捉,④Post网络请求错误无法获取到
注:
- window.onerror 函数只有在返回 true 的时候,异常才不会向上抛出,否则即使是知道异常的发生控制台还是会显示
- jsonp错误可以用添加运行跨域的方式获取错误
unhandledrejection
当Promise 被reject并且没有得到处理的时候,会触发unhandledrejection事件。
也就是 Promise 的全局错误处理,但是只有chrome 实现,现在还必须依靠挨个添加回调处理
添加 try catch
在于跨域资源相关头部信息失效时使用,在易出问题出添加,catch 添加错误处理或者上报等,
function badHandler(fn) {
try {
return fn();
} catch (e) { }
return null;
}
冗余代码太多,工作量增大不少
特殊: Vue
vue config 内可以定义的错误处理函数
Vue.config.errorHandler = function (err, vm, info) {
// handle error
// `info` 是 Vue 特定的错误信息,比如错误所在的生命周期钩子
// 只在 2.2.0+ 可用
}
只会捕获vue内部错误,无法替代window.onerror
捕获渲染,观察,生命周期,自定义事件,v-onDOM监听器内部抛错