前端有哪些异常
- JS 语法错误、代码异常
- AJAX 请求异常
- 静态资源加载异常
- Promise 异常
- Iframe 异常
- 崩溃和卡顿
try-catch: 处理预见错误
1、try-catch只能捕获到同步的运行时错误。2、try-catch是监听可预见逻辑错误。
1 | // 同步错误: try-catch遇到同步错误会执行到catch |
window.onerror:监听同步异步和iframe错误
1、onerror可以捕获同步异步错误。2、onerror最好写在所有JS脚本的前面,否则有可能捕获不到错误。
3、当 JS 运行时错误发生时,window 会触发一个 ErrorEvent 接口的 error 事件,并执行 window.onerror()。
1 | window.onerror = function(message, source, lineno, colno, error) { |
window.addEventListener(‘error’):监听资源(js/img/link)加载错误
window.addEventListener(‘error’)和window.onerror是同一种监听方式。当一项资源(如图片或脚本)加载失败,加载资源的元素会触发一个 Event 接口的 error 事件,并执行该元素上的onerror() 处理函数。这些 error 事件不会向上冒泡到 window ,所以必须在捕获阶段将其捕捉到才行,window.error默认为冒泡阶段,所以不能捕获。
1 | <img src="./jartto.png"> |
Script error另一种解决思路(仅参考)
改写了 EventTarget 的 addEventListener 方法。对传入的 listener 进行包装,返回包装过的 listener,对其执行进行 try-catch。
1 | const originAddEventListener = EventTarget.prototype.addEventListener; |
window.addEventListener(“unhandledrejection”): 捕获没有catch的Promise中的error
promise中catch可以非常方便的捕获到异步error,没有写catch的Promise中抛出的错误无法被onerror或try-catch捕获到
1 | // 正常 |
页面崩溃和卡顿
1 | const time = null |
Vue捕获错误
1 | Vue.config.errorHandler = (err, vm, info) => { |
React捕获错误
React 16 提供了一个内置函数 componentDidCatch,使用它可以非常简单的获取到 react 下的错误信息
1 | componentDidCatch(error, info) { |
监听错误总结
在开发的过程中,对于容易出错的地方,可以使用try{}catch(){}来进行错误的捕获,做好兜底处理,避免页面挂掉。而对于全局的错误捕获,在现代浏览器中,使用使用window.addEventListener(‘error’),window.addEventListener(‘unhandledrejection’)就行了。如果需要考虑兼容性,需要加上window.onerror,三者同时使用。