前端架构&软实力-异常监控
2020-06-08 22:33:012021-02-20 17:15:07
JavaScript中的异常处理方式
对于JavaScript而言,我们面对的仅仅只是异常,异常的出现并不会直接导致JavaScript引擎崩溃,最多只会使当前执行的任务终止
- 当前代码块将作为一个任务压入任务队列中,JavaScript引擎线程会不断地从任务队列中提取任务执行
- 当任务执行过程中出现异常,且异常没有捕获处理,则会一直沿着调用栈一层层向外抛出,最终终止当前任务地执行
- JavaScript引擎线程继续从任务队列中取出下一个任务继续执行
异常主要分为两大中:运行时错误和语法错误。语法错误在编写代码期间很容易被发现,运行时错误主要由取值/赋值异常、函数执行出错等
如何捕获异常
捕获普通JavaScript异常
对于普通的JavaScript异常,常见的做法是使用try-catch
进行包裹,当try
中的代码块执行出错后,catch
将能捕捉到异常,代码也可以继续执行下去
但try-catch
处理异常的能力有限,只能捕捉到运行时非异步错误,对于语法错误和异步错误就显得无能为力,捕捉不到
捕获异步JavaScript异常
window.onerror
捕获异常能力比try-catch
稍微强点,无论是异步还是非异步运行时错误,onerror
都能捕获到
window.onerror = function (msg, url, row, col, error) {
console.log('我知道错误了');
console.log({
msg, url, row, col, error
})
return true;
};
使用注意:
- 在实际的使用过程中,
windows.onerror
主要是来捕获预料之外的错误,而try-catch
则是用来在可预见情况下监控特定的错误,两者结合使用更加高效。 window.onerror
函数只有在返回 true 的时候,异常才不会向上抛出,否则即使是知道异常的发生控制台还是会显示window.onerror
无法捕获到网络异常的错误- 无法捕获
Promise
异常
捕获Promise 异常
通过 Promise
可以帮助我们解决异步回调地狱的问题,但是一旦 ~实例抛出异常而你没有用 catch
去捕获的话,onerror
或 try-catch
也无能为力,无法捕捉到错误
对此可以添加一个 Promise
全局异常捕获事件 unhandledrejection
window.addEventListener("unhandledrejection", function(e){
e.preventDefault()
console.log('我知道 promise 的错误了');
console.log(e.reason);
return true;
});
| | 同步方法 | 异步方法 | 资源加载 | Promise | async/await | |