Vue全局監(jiān)測錯誤并生成錯誤日志實現(xiàn)方法介紹
一、準(zhǔn)備工作
(1)規(guī)定錯誤碼
像是請求碼(404、500)一樣,我覺得錯誤都應(yīng)該規(guī)定好對應(yīng)的錯誤碼。個人喜好。
// 錯誤代碼 const errCode = new Map([ // 本地系統(tǒng)錯誤 ['E1001', '系統(tǒng)未知錯誤'], ['E1002', 'vue邏輯錯誤'], ['E1003', 'JavaScript錯誤'], ['E1004', '靜態(tài)資源加載錯誤'], ['E1005', '請求錯誤'], ['E1006', 'Promise錯誤'] ])
(2)設(shè)置錯誤處理函數(shù)
每個項目對于錯誤的處理不一樣,我這邊就不寫邏輯了。只做了保存日志。
這里導(dǎo)出處理函數(shù)是為了手動處理請求錯誤以及Promise.catch()
中的錯誤
// 錯誤處理函數(shù) export const errorHandler = (code: string, msg: string, file = 'null') => { // 這里處理監(jiān)聽到的錯誤 // 保存錯誤信息 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 // 錯誤內(nèi)容 router: string // 錯誤路由地址 file?: string // 錯誤的文件(不一定有) createTime: string // 發(fā)現(xiàn)錯誤的時間 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])) } }
二、監(jiān)聽錯誤
項目上線后出現(xiàn)的錯誤一般有四種,JS錯誤、靜態(tài)資源錯誤、vue邏輯錯誤、請求錯誤。其他的錯誤一般在編寫階段已經(jīng)提示了?;旧现槐O(jiān)聽這四種就能包含項目上線后可能出現(xiàn)的錯誤了。
(1)JS錯誤與靜態(tài)資源加載錯誤
例子:數(shù)組或者對象不存在某個值等等。這里我統(tǒng)稱JS錯誤了。監(jiān)聽方法如下:
window.addEventListener('error', (error: any) => { // 區(qū)分是否是js錯誤 if (error.message) { console.error('監(jiān)測到E1003錯誤'); errorHandler('E1003', error.message, error.filename) } else { console.error('監(jiān)測到E1004錯誤'); errorHandler('E1004', error.target.currentSrc, error.filename) } }, true)
(2)Vue邏輯錯誤
vue官方提供了一個能監(jiān)測組件渲染方法執(zhí)行期間及偵 聽 器拋出的未捕獲錯誤的方法 app.config.errorHandler
,app是main.ts中的app。
// vue渲染或者vue處理錯誤 app.config.errorHandler = (err: any) => { console.error('監(jiān)測到E1002錯誤'); console.error(err); errorHandler('E1002', err.name + ':' + err.message) }
(3)請求錯誤與Promise錯誤
這兩種錯誤本身有自己的監(jiān)聽函數(shù),所以只需要在監(jiān)聽到錯誤后調(diào)用之前導(dǎo)出的錯誤處理函數(shù)即可。
請求錯誤:在響應(yīng)攔截器中(axios.interceptors.response
) 中寫邏輯調(diào)用錯誤處理函數(shù)即可
Promise:在catch中調(diào)用錯誤處理函數(shù)即可
三、效果演示
隨便寫了個表格
四、完整代碼
使用方法:
// 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()與請求響應(yīng)器直接使用errorHandler
import { errorHandler } from '../utils/watchError' errorHandler('E1006', '測試Promise錯誤') errorHandler('E1005', `請求地址:${error.config.method}:${error.config.baseURL}/${error.config.url}`)
監(jiān)聽函數(shù):
// src/utils/watchError.ts import router from '@/router/index' // 錯誤代碼 const errCode = new Map([ // 本地系統(tǒng)錯誤 ['E1001', '系統(tǒng)未知錯誤'], ['E1002', 'vue邏輯錯誤'], ['E1003', 'JavaScript錯誤'], ['E1004', '靜態(tài)資源加載錯誤'], ['E1005', '請求錯誤'], ['E1006', 'Promise錯誤'] ]) // 開啟監(jiān)聽 export const watchError = (app: any) => { // vue渲染或者vue處理錯誤 app.config.errorHandler = (err: any) => { console.error('監(jiān)測到E1002錯誤'); console.error(err.filename); errorHandler('E1002', err.name + ':' + err.message) } // 靜態(tài)資源加載錯誤 或者 JS錯誤 window.addEventListener('error', (error: any) => { // 區(qū)分是否是js錯誤 if (error.message) { console.error('監(jiān)測到E1003錯誤'); errorHandler('E1003', error.message, error.filename) } else { console.error('監(jiān)測到E1004錯誤'); errorHandler('E1004', error.target.currentSrc, error.filename) } }, true) } // 錯誤處理函數(shù) export const errorHandler = (code: string, msg: string, file = 'null') => { // 這里處理監(jiān)聽到的錯誤 // 保存錯誤信息 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 // 錯誤內(nèi)容 router: string // 錯誤路由地址(根據(jù)hash地址‘/#/'切割而來,具體看需求) file?: string // 錯誤的文件(不一定有) createTime: string // 發(fā)現(xiàn)錯誤的時間 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 }) }
到此這篇關(guān)于Vue全局監(jiān)測錯誤并生成錯誤日志實現(xiàn)方法介紹的文章就介紹到這了,更多相關(guān)Vue錯誤日志內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
在移動端使用vue-router和keep-alive的方法示例
這篇文章主要介紹了在移動端使用vue-router和keep-alive的方法示例,vue-router與keep-alive提供的路由體驗與移動端是有一定差別的,感興趣的小伙伴們可以參考一下2018-12-12解決element-ui table設(shè)置列fixed時X軸滾動條無法拖動問題
這篇文章主要介紹了解決element-ui table設(shè)置列fixed時X軸滾動條無法拖動問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10Vue 中 filter 與 computed 的區(qū)別與用法解析
這篇文章主要介紹了Vue 中 filter 與 computed 的區(qū)別與用法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-11-11vue數(shù)據(jù)雙向綁定原理解析(get & set)
這篇文章主要為大家詳細(xì)解析了vue.js數(shù)據(jù)雙向綁定原理,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03Element-UI組件實現(xiàn)面包屑導(dǎo)航欄的示例代碼
面包屑導(dǎo)航欄是一種用戶界面組件,用于展示用戶在網(wǎng)站或應(yīng)用中的路徑,它包括了從主頁到當(dāng)前頁面的鏈接序列,有助于用戶快速了解和導(dǎo)航至上級頁面,本文就來介紹一下Element-UI組件實現(xiàn)面包屑導(dǎo)航欄的示例代碼,感興趣的可以了解一下2024-09-09