likes
comments
collection
share

总结下js捕获错误的几种方式

作者站长头像
站长
· 阅读数 75

前言

昨天写了一篇文章,在项目中使用了try-catch去捕获错误,但是因为没有在catch中输出日志,导致排查了很久才发现。

所以使用了try-catch,务必要在catch中把错误日志输出!!!

今天再来总结下js捕获错误的几种方式。

捕获错误

try-catch

try-catch用的比较多,可以捕获js的很多错误。

比如下面变量未声明就使用,以及访问不存在的属性等错误。

  try {
    console.log(a)
  } catch (error) {
    console.log('catch error:', error)
  }
  
  var obj = {}
  try {
    console.log(obj.name.a)
  } catch (error) {
    console.log('catch error:', error)
  }

总结下js捕获错误的几种方式

但是有两个错误try-catch不能捕获到

第一个是try-catch只能捕获同步的错误,如果是异步的错误就无法捕获。

比如promisesetTimeout.

  try {
    new Promise((resolve, reject) => {
      reject('err')
    })
  } catch (error) {
    console.log('catch error:', error)
  }

  try {
    setTimeout(() => {
      console.log(a)
    }, 100)
  } catch (error) {
    console.log('catch error:', error)
  }

总结下js捕获错误的几种方式

第二个是无法捕获语法错误。

我把答案cp3的引号去掉一半,以及把console.log的括号去掉一个。

  try {
    console.log('答案cp3
  } catch (error) {
    console.log('catch error:', error)
  }

总结下js捕获错误的几种方式

语法错误,如果你安装了eslint,就会有避免这个问题,因为eslint会有提示。

监听error事件

有2种方式:

第一种:window.onerror

  window.onerror = function (message, source, line, col, error) {
    console.log("catch error:",{message, source, line, col, error});
    // message: 错误的信息
    // source:  错误发生的文件
    // line:    错误发生的行数
    // col:     错误发生的列数
    // error:   错误对象
  };

第二种:window.addEventListener('error')

  window.addEventListener('error', (error) => {
    console.log('catch error:', error)
  })

使用的时候都尽量在加载js资源前就实现监听。

这两种有什么区别呢?

这两者很相似,语法错误代码错误都能捕获。然后和try-catch一样,异步错误不能捕获。

  window.onerror = function (message, source, line, col, error) {
    console.log("catch error:",{message, source, line, col, error});
  };
  window.addEventListener('error', (error) => {
    console.log('error:', error)
  })
  new Promise((resolve, reject) => {
    reject('err')
  })

总结下js捕获错误的几种方式

window.onerror的打印日志比addEventListener方式的多一点。

然后如果是资源加载失败,window.onerror无法捕获,window.addEventListener('error')可以捕获,但是得是在捕获阶段才行。

捕获阶段就是第三个参数需要设置为true

  window.addEventListener('error', (error) => {
    console.log('catch error:', error)
  }, true)
  
 <img src="https://www.baidu.com/404.jpg" alt="">

总结下js捕获错误的几种方式

unhandledrejection

针对上面提到的异步错误, try-catch和监听error事件无法捕获,我们可以通过监听unhandledrejection事件来实现捕获。

  window.addEventListener('unhandledrejection', (error) => {
    console.log('catch error:', error)
  })
  new Promise((resolve, reject) => {
    reject('promise error')
  })

总结下js捕获错误的几种方式

可以看到,捕获到reject的错误了。

vue的errorHandler函数

vue的捕获异常函数,可以通过全局配置来errorHandler函数来捕获错误。内部实现也是通过try-catch来捕获。

Vue.config.errorHandler = (err, vm, info) => {
  console.log(err, vm, info)
  // err: 错误对象
  // vm: 发生错误的实例
  // info: 错误信息
}
throw new Error('i am err')

总结下js捕获错误的几种方式

大家如果还有其他方式或者疑问,可以评论交流。

感谢你的阅读。

转载自:https://juejin.cn/post/7085004641791901726
评论
请登录