【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦

【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦

目录

【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦

一、为什么要做全局错误处理?

1、将业务逻辑与错误处理解耦

2、为监控和埋点提供统一入口

二、Vue 中的基础全局错误处理方式

1、Vue 中全局错误处理写法

2、它会捕获哪些错误?

3、它不会捕获哪些错误?

4、errorHandler 的参数含义

三、全局错误处理的进阶设计

1、定义“可识别的业务错误”

2、在 errorHandler 中做真正的“分类处理”

3、补齐 Promise reject 的捕获能力

4、错误处理的策略化封装

四、结语


        作者:watermelo37

        ZEEKLOG优质创作者、华为云云享专家、阿里云专家博主、腾讯云“创作之星”特邀作者、火山KOL、支付宝合作作者,全平台博客昵称watermelo37。

        一个假装是giser的coder,做不只专注于业务逻辑的前端工程师,Java、Docker、Python、LLM均有涉猎。



---------------------------------------------------------------------

温柔地对待温柔的人,包容的三观就是最大的温柔。

---------------------------------------------------------------------

【前端实战】构建 Vue 全局错误处理体系,实现业务与错误的清晰解耦

        前段时间,我分享了一种替代传统 try-的链式调用封装思路,适用于处理项目中的特定错误,或在开发阶段临时用于调试;还分享了一种在网络层面实现数据与状态解耦的 Axios 错误处理封装方案,可供项目集中处理请求和响应阶段的错误,有兴趣的读者可以看看:

        【前端实战】从 try-catch 回调到链式调用:一种更优雅的 async/await 错误处理方案

        【前端实战】Axios 错误处理的设计与进阶封装,实现网络层面的数据与状态解耦

        但是这两种方案都局限在特定场景下,虽然绝大多数错误都发生在网络层,但这并不能满足生产环境下的项目需求,那有没有一种全局错误处理机制呢?

一、为什么要做全局错误处理?

1、将业务逻辑与错误处理解耦

        在业务模块中,我们真正关心的是数据是否可用,以及页面状态如何变化,并不关心网络异常的类型、提示和跳转。所以需要将错误策略抽离到全局层,让业务代码只专注于处理业务,全局错误处理层专注于处理各类错误,解耦后业务层和全局错误层都更加纯粹,也更有利于长期维护和拓展。

2、为监控和埋点提供统一入口

        项目上线后,对于错误信息除了要建立临时应对和处理机制外,还需要定时收集和上报,给错误分级,还要收集用户的环境信息,这样才能给开发者提供准确的数据信息,从而针对性的修复 bug 以及性能优化。

二、Vue 中的基础全局错误处理方式

1、Vue 中全局错误处理写法

        在 Vue 3 中,官方提供了一个明确的入口:app.config.errorHandler。在 main.js 中,添加如下代码即可:

const app = createApp(App) app.config.errorHandler = (err, instance, info) => { console.error(err) } 

2、它会捕获哪些错误?

        app.config.errorHandler 只会捕获 Vue 运行时上下文中的错误,包括:

  • 组件 setup / render 中的同步错误
  • 生命周期钩子中的错误
  • 模板渲染期间的错误
  • watch / computed 中抛出的错误
  • 被 Vue 追踪的 Promise 链中的错误

3、它不会捕获哪些错误?

        不在上述范围内,脱离了 Vue 的响应式调度体系的错误均不会被捕获,比如:

setTimeout(() => { throw new Error('timeout error') // 不会捕获 }) fetch('/api').then(() => { throw new Error('fetch error') // 不会捕获 }) 

        所以 Promise 的 reject 并不会天然进全局错误处理,后面进阶方案里会解决这个问题。

4、errorHandler 的参数含义

        Vue 3 中的定义如下:

app.config.errorHandler = ( err: unknown, instance: ComponentPublicInstance | null, info: string ) => void 

        三个参数的具体意义为:

app.config.errorHandler = (err, instance, info) => { console.log(err) // 实际抛出的错误对象 console.log(instance) // 出错的组件实例(可能为 null) console.log(info) // 错误来源描述(字符串) } 

三、全局错误处理的进阶设计

1、定义“可识别的业务错误”

        真正的工程实践中,我们关心错误是为了解决错误,所以需要对业务错误进行鉴别分类。

        首先需要定义可识别的业务错误基类及其派生类,比如:

export class BusinessError extends Error { constructor(message, code) { super(message) this.code = code this.isBusinessError = true } } export class AuthError extends BusinessError { constructor(message = '登录已失效') { super(message, 'AUTH_ERROR') } } export class PermissionError extends BusinessError { constructor(message = '没有操作权限') { super(message, 'PERMISSION_ERROR') } } 

        在具体的业务代码中,遇到错误时,就使用对应的错误类实例化并抛出,app.config.errorHandler 就会捕获到这个错误实例,比如:

if (!token) { throw new AuthError() } 

2、在 errorHandler 中做真正的“分类处理”

        现在,在定义了可识别的业务错误之后,全局错误处理的优势就体现出来了,此时业务错误类型可控,有基础应对手段,并且还有错误上报策略 reportError 以应对突发情况:

app.config.errorHandler = (err, instance, info) => { if (err instanceof BusinessError) { handleBusinessError(err) return } handleUnknownError(err, instance, info) } 
export function handleBusinessError(err) { ElMessage.warning(err.message) if (err.code === 'AUTH_ERROR') { router.push('/login') } } export function handleUnknownError(err, instance, info) { ElMessage.error('系统异常,请稍后再试') reportError({ err, component: instance?.type?.name, info, }) } export function reportError({ err, component, info }) { const payload = { message: err.message, stack: err.stack, component, info, ua: navigator.userAgent, time: Date.now(), } fetch('/error/report', { method: 'POST', body: JSON.stringify(payload), }) }

        reportError 方法收集了错误的类型、信息、位置、发生时间,客户端的类型、操作系统、浏览器版本等信息,集中上报等待解决。

3、补齐 Promise reject 的捕获能力

        前面说过,errorHandler 不会自动捕获所有 Promise 的 reject,工程中常见解决方案是在请求层统一转抛错误,这就回到了文章开头时我们提到的在网络层面实现数据与状态解耦的 Axios 错误处理封装方案,由于那篇博文已经详细介绍过了,这里只给个简要的例子:

axios.interceptors.response.use( res => res, err => { throw err // 重新抛给 Vue } ) 

        这样就能保证所有异常最终都会汇聚到一个出口。

4、错误处理的策略化封装

        看到这个词有些粉丝可能会有印象,以前的博文也提到过策略表模式,在全局错误处理中依然好用,这样就不用在 errorHandler 里写一堆 if else了,更容易拓展和维护,比如:

app.config.errorHandler = (err) => { const handler = errorStrategyMap[err.code] || errorStrategyMap.default handler(err) }
const errorStrategyMap = { AUTH_EXPIRED: (err) => { ElMessage.error(err.message) router.push('/login') }, default: (err) => { ElMessage.error('系统异常') reportError(err) } } 

四、结语

        通过进阶的全局错误处理设计,将业务逻辑与错误处理解耦,不仅能让页面代码更加清晰简洁,还能实现错误的分级处理,从而显著提升项目在生产环境中的可维护性和长期稳定性。

        只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

        其他热门文章,请关注:

        极致的灵活度满足工程美学:用Vue Flow绘制一个完美流程图

        你真的会使用Vue3的onMounted钩子函数吗?Vue3中onMounted的用法详解

        Web Worker:让前端飞起来的隐形引擎

        测评:这B班上的值不值?在不同城市过上同等生活水平到底需要多少钱?

        通过array.filter()实现数组的数据筛选、数据清洗和链式调用

        DeepSeek:全栈开发者视角下的AI革命者

        TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

        通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能

        高效工作流:用Mermaid绘制你的专属流程图;如何在Vue3中导入mermaid绘制流程图

        通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制

      【前端实战】如何让用户回到上次阅读的位置?

        前端实战:基于Vue3与免费满血版DeepSeek实现无限滚动+懒加载+瀑布流模块及优化策略

        深入理解 JavaScript 中的 Array.find() 方法:原理、性能优势与实用案例详解

        el-table实现动态数据的实时排序,一篇文章讲清楚elementui的表格排序功能

        JavaScript双问号操作符(??)详解,解决使用 || 时因类型转换带来的问题

        内存泄漏——海量数据背后隐藏的项目生产环境崩溃风险!如何避免内存泄漏

        MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver

        JavaScript中通过array.map()实现数据转换、创建派生数组、异步数据流处理、DOM操作等

Read more

GLM-4v-9b实战指南:用llama.cpp GGUF格式在消费级GPU部署多模态模型

GLM-4v-9b实战指南:用llama.cpp GGUF格式在消费级GPU部署多模态模型 1. 为什么你需要关注GLM-4v-9b 你有没有遇到过这样的场景:一张密密麻麻的财务报表截图发到工作群,大家却没人愿意花十分钟手动抄录数据;或者客户发来一张手机拍的电路板照片,问“这个元件型号是什么”,你只能回个尴尬的微笑;又或者团队正在做竞品分析,需要从几十份PDF产品手册里快速提取图表信息——这些不是小问题,而是每天真实消耗工程师、运营、产品经理大量时间的“视觉理解黑洞”。 过去,这类任务要么靠人工硬啃,要么得调用API付费接口,响应慢、成本高、隐私难保障。直到2024年,智谱AI开源了glm-4v-9b——一个真正能在你自己的RTX 4090上跑起来的90亿参数多模态模型。它不只是一张“能看图说话”的新名片,而是把高分辨率图像理解能力,塞进了一张消费级显卡的显存里。 重点来了:它支持原生1120×1120输入,这意味着你不用再把一张A4扫描件缩成模糊小图上传;它对中文表格、小字号OCR、技术类图表的理解,在公开评测中直接超过了GPT-4-turbo和Claude 3 Opus;

VScode Cline 中免费使用 gpt 5.4 和copilot 中的模型

VScode Cline 中免费使用 gpt 5.4 和copilot 中的模型

前提:vscode 安装 cline 插件(默认都会), gpt plus 账户(联系我获取), github copilot 会员权益账户(有教程链接) 一、通过授权登录 ChatGPT plus 账户,使用gpt-5.4 1、打开cline 设置; 2、API Provider选择:ChatGPT Subscription,授权登录即可;   3、显示如下即可使用gpt -5.4(1M上下文,相比与5.3-codex 400k 提升了1倍多); 二、使用github copilot 中的模型; 1、安装 github copilot 插件并登录你有会员权益的 github 账户;

Stable-Diffusion-3.5 Java开发实战:SpringBoot微服务集成指南

Stable-Diffusion-3.5 Java开发实战:SpringBoot微服务集成指南 1. 开篇:为什么要在SpringBoot中集成Stable-Diffusion-3.5? 如果你正在开发一个需要AI图像生成功能的Java应用,可能会遇到这样的问题:Python生态的AI模型怎么和Java微服务架构结合?其实很简单,通过RESTful API的方式,我们就能让SpringBoot应用轻松调用Stable-Diffusion-3.5的图像生成能力。 想象一下这样的场景:你的电商平台需要自动生成商品海报,内容社区想要为用户提供头像生成功能,或者设计工具希望集成AI绘图能力。这些都是Stable-Diffusion-3.5在Java应用中很典型的应用场景。 我自己在项目中集成过多个AI模型,最大的感受是:关键不在于技术多复杂,而在于找到简单可靠的集成方式。接下来,我会带你一步步实现这个集成过程。 2. 环境准备与项目搭建 2.1 基础环境要求 在开始之前,确保你的开发环境满足以下要求: * JDK 11或更高版本 * Maven 3.6+ 或 Gradl

AI写作泛滥?这几款免费检测AI率的工具你不能错过!

AI写作泛滥?这几款免费检测AI率的工具你不能错过!

本文由图灵论文AI写作助手团队整理发布。图灵论文AI写作助手是一款专注于论文领域的神级工具,仅需输入标题,即可一键生成完整全文,字数最高可达5万字以上,实现从选题、论文写作到答辩的全流程智能闭环。 人工智能技术正以迅猛之势发展,如今,AI写作在众多领域都成了不可或缺的得力工具。无论是撰写学术论文、完成商业报告,亦或是处理日常文案,AI写作都能提供高效的助力。然而随之而来的是AI写作内容泛滥的问题,怎样辨别并降低AI生成内容(AIGC)的比例,成了亟待解决的一大难题。今天,我们就为大家介绍几款免费的AI率检测工具,同时分享一些实用的降低AIGC率的方法以及相关的prompt指令。 一、图灵论文AI写作助手——专注于论文领域的神级工具 1.1 工具简介 图灵论文AI写作助手是专门为学术论文写作而精心设计的一款AI工具。它不仅能够高效地帮助用户生成论文内容,而且每天还能无限次免费检测AIGC率。凭借其强大的算法以及丰富的学术资源库,这款工具成了众多学者和研究生的首选。 1.2 主要功能 * AI写作生成:依据用户输入的主题和关键词,生成高质量的论文内容。 * AIGC率检测