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网络请求错误无法获取到

注:

  1. window.onerror 函数只有在返回 true 的时候,异常才不会向上抛出,否则即使是知道异常的发生控制台还是会显示
  2. 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监听器内部抛错