前端架构&软实力-异常监控

2020-06-08 22:33:012021-02-20 17:15:07

JavaScript中的异常处理方式

对于JavaScript而言,我们面对的仅仅只是异常,异常的出现并不会直接导致JavaScript引擎崩溃,最多只会使当前执行的任务终止

  1. 当前代码块将作为一个任务压入任务队列中,JavaScript引擎线程会不断地从任务队列中提取任务执行
  2. 当任务执行过程中出现异常,且异常没有捕获处理,则会一直沿着调用栈一层层向外抛出,最终终止当前任务地执行
  3. 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 去捕获的话,onerrortry-catch 也无能为力,无法捕捉到错误

对此可以添加一个 Promise 全局异常捕获事件 unhandledrejection

window.addEventListener("unhandledrejection", function(e){
  e.preventDefault()
  console.log('我知道 promise 的错误了');
  console.log(e.reason);
  return true;
});

| | 同步方法 | 异步方法 | 资源加载 | Promise | async/await | |