Vue全局监测错误并生成错误日志实现方法介绍

 更新时间:2022年10月20日 11:42:59   作者:DDDHL_  
在做完一个项目后,之后的维护尤为重要。这时,如果项目配置了错误日志记录,这样能大大减少维护难度。虽然不一定能捕获到全部的错误,但是一般的错误还是可以监测到的。这样就不用测试人员去一遍一遍复现bug了

一、准备工作

(1)规定错误码

像是请求码(404、500)一样,我觉得错误都应该规定好对应的错误码。个人喜好。

// 错误代码
const errCode = new Map([
  // 本地系统错误
  ['E1001', '系统未知错误'],
  ['E1002', 'vue逻辑错误'],
  ['E1003', 'JavaScript错误'],
  ['E1004', '静态资源加载错误'],
  ['E1005', '请求错误'],
  ['E1006', 'Promise错误']
])

(2)设置错误处理函数

每个项目对于错误的处理不一样,我这边就不写逻辑了。只做了保存日志。

这里导出处理函数是为了手动处理请求错误以及Promise.catch()中的错误

// 错误处理函数
export const errorHandler = (code: string, msg: string, file = 'null') => {
  // 这里处理监听到的错误
  // 保存错误信息
  saveLog({ code: code, type: errCode.get(`$[code]`), msg: msg, router: router.currentRoute.value.fullPath, file: file, createTime: new Date().toLocaleString() })
}

(3)保存错误日志

演示保存到 localStorage中,并且只存50条,超过则把最旧的删除

type errorParams = {
  code: string    				// 错误代码
  msg: string	  				// 错误内容
  router: string				// 错误路由地址
  file?: string					// 错误的文件(不一定有)
  createTime: string			// 发现错误的时间
  type?: string					// 错误的类型
}
// localstorage 保存错误信息 最多50条避免爆满
const saveLog = (data: errorParams): void => {
  const nowData = localStorage.getItem('ERROR')
  if (nowData) {
    const allData = JSON.parse(nowData)
    sortArray(allData)
    // 只存50条错误信息
    if (allData.length > 50) {
      // 已存50条
      allData[0] = data
      sortArray(allData)
    } else {
      allData.push(data)
    }
    localStorage.setItem('ERROR', JSON.stringify(allData))
  } else {
    localStorage.setItem('ERROR', JSON.stringify([data]))
  }
}

二、监听错误

项目上线后出现的错误一般有四种,JS错误、静态资源错误、vue逻辑错误、请求错误。其他的错误一般在编写阶段已经提示了。基本上只监听这四种就能包含项目上线后可能出现的错误了。

(1)JS错误与静态资源加载错误

例子:数组或者对象不存在某个值等等。这里我统称JS错误了。监听方法如下:

window.addEventListener('error', (error: any) => {
    // 区分是否是js错误
    if (error.message) {
      console.error('监测到E1003错误');
      errorHandler('E1003', error.message, error.filename)
    } else {
      console.error('监测到E1004错误');
      errorHandler('E1004', error.target.currentSrc, error.filename)
    }
}, true)

(2)Vue逻辑错误

vue官方提供了一个能监测组件渲染方法执行期间及侦 听 器抛出的未捕获错误的方法 app.config.errorHandler,app是main.ts中的app。

 // vue渲染或者vue处理错误
app.config.errorHandler = (err: any) => {
    console.error('监测到E1002错误');
    console.error(err);
    errorHandler('E1002', err.name + ':' + err.message)
}

(3)请求错误与Promise错误

这两种错误本身有自己的监听函数,所以只需要在监听到错误后调用之前导出的错误处理函数即可。

请求错误:在响应拦截器中(axios.interceptors.response) 中写逻辑调用错误处理函数即可

Promise:在catch中调用错误处理函数即可

三、效果演示

随便写了个表格

四、完整代码

使用方法:

// main.ts
import { createApp } from 'vue'
import { createPinia } from 'pinia'
import { watchError } from './utils/watchError'
import App from './App.vue'
import router from './router'
const app = createApp(App)
app.use(createPinia())
app.use(router)
app.mount('#app')
// 如果没有app,自己用个变量等于createApp即可
watchError(app)

Promise.catch()与请求响应器直接使用errorHandler

import { errorHandler } from '../utils/watchError'
errorHandler('E1006', '测试Promise错误')
errorHandler('E1005', `请求地址:${error.config.method}:${error.config.baseURL}/${error.config.url}`)

监听函数:

// src/utils/watchError.ts
import router from '@/router/index'
// 错误代码
const errCode = new Map([
  // 本地系统错误
  ['E1001', '系统未知错误'],
  ['E1002', 'vue逻辑错误'],
  ['E1003', 'JavaScript错误'],
  ['E1004', '静态资源加载错误'],
  ['E1005', '请求错误'],
  ['E1006', 'Promise错误']
])
// 开启监听
export const watchError = (app: any) => {
  // vue渲染或者vue处理错误
  app.config.errorHandler = (err: any) => {
    console.error('监测到E1002错误');
    console.error(err.filename);
    errorHandler('E1002', err.name + ':' + err.message)
  }
  // 静态资源加载错误 或者 JS错误
  window.addEventListener('error', (error: any) => {
    // 区分是否是js错误
    if (error.message) {
      console.error('监测到E1003错误');
      errorHandler('E1003', error.message, error.filename)
    } else {
      console.error('监测到E1004错误');
      errorHandler('E1004', error.target.currentSrc, error.filename)
    }
  }, true)
}
// 错误处理函数
export const errorHandler = (code: string, msg: string, file = 'null') => {
  // 这里处理监听到的错误
  // 保存错误信息
  saveLog({ code: code, type: errCode.get(`$[code]`), msg: msg, router: router.currentRoute.value.fullPath, file: file, createTime: new Date().toLocaleString() })
}
type errorParams = {
  code: string    				// 错误代码
  msg: string	  				// 错误内容
  router: string				// 错误路由地址(根据hash地址‘/#/'切割而来,具体看需求)
  file?: string					// 错误的文件(不一定有)
  createTime: string			// 发现错误的时间
  type?: string					// 错误的类型
}
// localstorage 保存错误信息 最多50条避免爆满
const saveLog = (data: errorParams): void => {
  const nowData = localStorage.getItem('ERROR')
  if (nowData) {
    const allData = JSON.parse(nowData)
    sortArray(allData)
    // 只存50条错误信息
    if (allData.length > 50) {
      // 已存50条
      allData[0] = data
      sortArray(allData)
    } else {
      allData.push(data)
    }
    localStorage.setItem('ERROR', JSON.stringify(allData))
  } else {
    localStorage.setItem('ERROR', JSON.stringify([data]))
  }
}
// 错误日志排序
const sortArray = (allData: string[]) => {
  allData.sort((a: any, b: any) => {
    if (a.createTime > b.createTime) {
      return 1
    }
    return -1
  })
}

到此这篇关于Vue全局监测错误并生成错误日志实现方法介绍的文章就介绍到这了,更多相关Vue错误日志内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Ant Design封装年份选择组件的方法

    Ant Design封装年份选择组件的方法

    这篇文章主要为大家详细介绍了Ant Design封装年份选择组件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 简单理解vue中实例属性vm.$els

    简单理解vue中实例属性vm.$els

    这篇文章主要帮助大家简单理解vue中实例属性vm.$els,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 在移动端使用vue-router和keep-alive的方法示例

    在移动端使用vue-router和keep-alive的方法示例

    这篇文章主要介绍了在移动端使用vue-router和keep-alive的方法示例,vue-router与keep-alive提供的路由体验与移动端是有一定差别的,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 解决element-ui table设置列fixed时X轴滚动条无法拖动问题

    解决element-ui table设置列fixed时X轴滚动条无法拖动问题

    这篇文章主要介绍了解决element-ui table设置列fixed时X轴滚动条无法拖动问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • Vue 中 filter 与 computed 的区别与用法解析

    Vue 中 filter 与 computed 的区别与用法解析

    这篇文章主要介绍了Vue 中 filter 与 computed 的区别与用法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • vue数据双向绑定原理解析(get & set)

    vue数据双向绑定原理解析(get & set)

    这篇文章主要为大家详细解析了vue.js数据双向绑定原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • vuex安装失败解决的方法实例

    vuex安装失败解决的方法实例

    Vuex是一个专为Vue.js应用程序开发的状态管理模式,下面这篇文章主要给大家介绍了关于vuex安装失败解决的方法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • elementPuls 表格反选实现示例代码

    elementPuls 表格反选实现示例代码

    这篇文章主要介绍了elementPuls 表格反选实现示例代码,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-07-07
  • Element-UI组件实现面包屑导航栏的示例代码

    Element-UI组件实现面包屑导航栏的示例代码

    面包屑导航栏是一种用户界面组件,用于展示用户在网站或应用中的路径,它包括了从主页到当前页面的链接序列,有助于用户快速了解和导航至上级页面,本文就来介绍一下Element-UI组件实现面包屑导航栏的示例代码,感兴趣的可以了解一下
    2024-09-09
  • vue引入cesium问题

    vue引入cesium问题

    这篇文章主要介绍了vue引入cesium问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10

最新评论