跨平台应用开发进阶(十八) :全局异常日志处理方案探究_uniapp 获取后台抛出的异常

57 阅读3分钟

最后

面试题千万不要死记,一定要自己理解,用自己的方式表达出来,在这里预祝各位成功拿下自己心仪的offer。

大厂面试题

面试题目录

开源分享:docs.qq.com/doc/DSmRnRG… errorLog: ['production', 'development'] }


然后,准备一个状态管理相关文件,用于记录日志。


**errorLog.js**



const state = { logs: [] }

const mutations = { ADD_ERROR_LOG: (state, log) => { state.logs.push(log) }, CLEAR_ERROR_LOG: (state) => { state.logs.splice(0) } }

const actions = { addErrorLog({ commit }, log) { commit('ADD_ERROR_LOG', log) }, clearErrorLog({ commit }) { commit('CLEAR_ERROR_LOG') } }

export default { namespaced: true, state, mutations, actions }

`store/index.js`中引入`errorLog`模块


**store/index.js**



import Vue from 'vue' import Vuex from 'vuex' import errorLog from './modules/errorLog'

Vue.use(Vuex) const debug = process.env.NODE_ENV !== 'production'

export default new Vuex.Store({ modules: { errorLog }, // 在严格模式下,无论何时发生了状态变更且不是由 mutation 函数引起的,将会抛出错误。这能保证所有的状态变更都能被调试工具跟踪到。 strict: debug })


然后写一个插件,将全局异常处理函数挂载在`Vue.config.errorHandler`上。


**utils/error-log.js**



import store from '@/store' import { isString, isArray } from './util'

import config from '@/setting'

const install = function (Vue) { const { errorLog: needErrorLog } = config;

function checkNeed() {
	const env = process.env.NODE_ENV;
	
	if (isString(needErrorLog)) {
		return env === needErrorLog
	}
	
	if (isArray(needErrorLog)) {
		return needErrorLog.includes(env)
	}
	
	return false
}

function writeErrorLog({
	err,
	route
}) {
	// ajax 调用后台接口去记录日志
}

function errorHandler(err, vm, info, a) {
	// route: uni-app路由,这里可以修改成自己的内容或去掉
	let pages = getCurrentPages(),
		route = '';
	if (pages.length) {
		route = pages[pages.length - 1].route;
	}
	console.error('globalError', err);
	vm && console.error('globalError-vm', vm);
	info && console.error(info);
	route && console.error('page', route); // route: uni-app路由,这里可以修改成自己的内容或去掉
	
	if (checkNeed()) {
		// Don't ask me why I use Vue.nextTick, it just a hack.
		// detail see https://forum.vuejs.org/t/dispatch-in-vue-config-errorhandler-has-some-problem/23500
		Vue.nextTick(() => {
			store.dispatch('errorLog/addErrorLog', {
				err,
				info,
				route // route:uni-app路由,这里可以修改成自己的内容或去掉
			})
			
			writeErrorLog({
				err,
				info,
				route // route:uni-app路由,这里可以修改成自己的内容或去掉
			})
		})
	}
}

// 挂载在原型上,即可以在其他页面中使用this.$throw
Vue.prototype.$throw = errorHandler
Vue.config.errorHandler = errorHandler

}

export default install;


至此,已经实现了全局的错误拦截和状态记录。


### 三、uni-app优化


如果是`uni-app`项目,也可以在`App.vue`中定义生命周期钩子`onError`执行`$thow`,这样也能触发全局的错误处理函数。  
 **App.vue**



export default { onLaunch() { console.log('App-Launch'); },

onShow() {
	console.log('App Show');
},

onHide() {
	console.log('App Hide')
},

onError(err) {
	this.$throw(err);
}

}


也可以在页面中使用`errorCaptured`捕获页面中发生的异常。


### 最后

你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『**难的不会,会的不难**』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://docs.qq.com/doc/DSmRnRGxvUkxTREhO)**

**我特地针对初学者整理一套前端学习资料**

![前端路线图](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/843ea9c64f164464b594fe544952d125~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771933249&x-signature=Ql46Og%2FUxxZ0jIxu3P0qM%2FKazfs%3D)

![vue.js的36个技巧](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/54c32d4b022947c8a984c04782589980~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MzM5MTQ5MjgwNjA=:q75.awebp?rk3s=f64ab15b&x-expires=1771933249&x-signature=0%2F%2BF5%2FlfTAlWxQW1g9uM3m5UrZY%3D)