「前端每日一问(65)」Vue3 如何进行统一错误处理?

920 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第30天,点击查看活动详情

本题难度:⭐

本题类型:Vue

答:使用应用配置里的 errorHandler,统一处理错误。

讲解

如何统一处理错误?

我们来做个测试,随便写一个会报错的组件,代码如下:

<template>
  <div>页面</div>
</template>

<script setup>

let obj = null
obj.name // 这里会报错

</script>

这段代码会导致报错且阻断程序,页面白屏,如下图:

image.png

接下来,我们来解决这个问题,在全局加上错误处理,代码如下:

import { createApp } from 'vue'
import App from './App.vue'

const app = createApp(App)

app.config.errorHandler = (err, vm, info) => {
  console.log('err :>> ', err);
}

app.mount('#app')

指定一个处理函数,来处理组件渲染函数和侦听器执行期间抛出的未捕获错误。这个处理函数被调用时,可获取错误信息和相应的应用实例。

错误就能被捕获到,且页面能正常渲染。

image.png

捕获到了错误,就可以做一些统一的处理来了,比如上报日志。

原理

关于原理,可以参考下面这个工具函数,这里我们给这个工具函数写了错误处理逻辑。

假设工具函数写在 utils.js 里,在 index.js 里调用工具函数,错误处理的逻辑就写在外部 index.js 里,利用的是回调函数。

// utils.js
let handlerError = null
export default {
  // 功能函数 foo
  foo(callback) {
    callWithErrorHandling(callback)
  },
  // 功能函数 bar
  bar(callback) {
    callWithErrorHandling(callback)
  },
  // 用户可以调用该函数注册统一的错误处理函数
  errorHandler(errCallback) {
    handlerError = errCallback
  }
}

// 内部的统一错误处理函数
function callWithErrorHandling (callback) {
  try {
    callback && callback()
  } catch(err) {
    // 将捕获的错误传递给用户的错误处理程序
    handlerError(err)
  }
}
// index.js
import utils from 'utils.js'
// 注册错误处理程序
utils.errorHandler((err) => {
  // 用户端统一处理报错的逻辑写到这里
  console.log('err :>> ', err);
})

// 调用功能函数 foo
utils.foo(() => {
  // 代码里有会导致报错的逻辑
  let userInfo = null
  userInfo.name
})

至于 Vue3 详细的原理,去源码里搜索 callWithErrorHandling,就能看到,和这个工具函数的原理是一样的。

结尾

本文参考:Vue.js设计与实现

阿林水平有限,文中如果有错误或表达不当的地方,非常欢迎在评论区指出,感谢~

如果我的文章对你有帮助,你的👍就是对我的最大支持^_^

我是阿林,输出洞见技术,再会!

上一篇:

「前端每日一问(64)」Vue3 项目打包时如何关闭 options API ?