问题简述
浏览器提供了若干错误处理方法,能够全局处理未捕获的异常,列举如下
// 能对语法异常和运行时异常(异步也能捕获)进行处理,但是对语法错误和网络错误无能为力
window.onerror = () => {
}
// 可以搞定网络资源加载错误(第三个参数必须是 true)
window.addEventListener('error', () => {
})
// 捕获没有 catch 的 rejection,前面二者无法处理
window.addEventListener('unhandledrejection', () => {
})
如果随便找一个网站,打开它的控制台会发现好多报错,这时如果手动给它加上错误处理,会发现自己的回调函数是一个也没有被调用,这是为什么呢?
解答
尽管控制台红红的一片全是错误,甚至有的因为使用了诸如 AdBlock, Ublock Origin
等类似的拦截插件,会出现成百上千的错误,但都是已经捕捉了的错误,因为使用了 console.error()
而看起来是大量未捕捉的错误
如果在添加了错误事件监听器后,手动 throw new Error('error content')
会发现回调函数此时尽数都被调用