当前位置: 首页 > article >正文

Vue 3 项目错误处理实战:Vue ErrorHandler、Promise 监控、用户友好提示

前言一个健壮的错误处理机制可以提升用户体验帮助开发者快速定位问题。今天分享如何实现完善的错误处理和监控错误分类错误类型 ├── Vue 渲染错误 │ ├── 组件渲染错误 │ ├── 生命周期钩子错误 │ └── 模板语法错误 ├── JavaScript 运行时错误 │ ├── TypeError │ ├── ReferenceError │ └── 自定义业务错误 ├── 异步错误 │ ├── Promise rejection │ ├── setTimeout/setInterval │ └── Web API 错误 └── 资源加载错误 ├── 图片加载失败 ├── 脚本加载失败 └── API 请求失败核心实现1. 全局错误处理// src/utils/errorHandler.tsimport{isDev}from./env// 错误日志服务classErrorLogger{privatelogs:ErrorLog[][]privatemaxLogs100log(error:Error,context?:string){constlog:ErrorLog{id:err_${Date.now()},message:error.message,stack:error.stack,context,timestamp:Date.now(),userAgent:navigator.userAgent,url:window.location.href}this.logs.unshift(log)// 只保留最近 N 条if(this.logs.lengththis.maxLogs){this.logsthis.logs.slice(0,this.maxLogs)}// 开发环境输出到控制台if(isDev){console.error([Error],context,error)}// 上报到服务器生产环境if(!isDev){this.reportToServer(log)}}privateasyncreportToServer(log:ErrorLog){// 可以发送到你的日志服务try{awaitfetch(/api/error-report,{method:POST,headers:{Content-Type:application/json},body:JSON.stringify(log)})}catch(e){// 存储到 localStorage 作为后备this.saveToLocalStorage(log)}}privatesaveToLocalStorage(log:ErrorLog){constkeyerror_logsconstexistingJSON.parse(localStorage.getItem(key)||[])existing.push(log)localStorage.setItem(key,JSON.stringify(existing.slice(-50)))}getLogs():ErrorLog[]{returnthis.logs}}interfaceErrorLog{id:stringmessage:stringstack?:stringcontext?:stringtimestamp:numberuserAgent:stringurl:string}exportconsterrorLoggernewErrorLogger()2. Vue 错误处理器// src/main.tsimport{createApp}fromvueimportAppfrom./App.vueimport{errorLogger}from/utils/errorHandlerconstappcreateApp(App)// Vue 渲染错误处理app.config.errorHandler(err,instance,info){// err: 错误对象// instance: 发生错误的组件实例// info: 额外的错误信息如生命周期钩子名称console.error(Vue Error:,err)console.error(Component:,instance)console.error(Info:,info)errorLogger.log(err,Vue Error [${info}])// 可以在这里显示用户友好的错误提示// showErrorToast(发生了一些问题请稍后重试)}// 组件警告处理开发环境if(import.meta.env.DEV){app.config.warnHandler(msg,instance,trace){console.warn(Vue Warn:,msg)console.warn(Trace:,trace)}}// 异步错误处理app.config.asyncErrorHandler(err,instance,info){errorLogger.log(err,Async Error [${info}])}app.mount(#app)3. Promise 错误处理// src/utils/promiseHandler.ts// 全局未处理的 Promise rejectionwindow.addEventListener(unhandledrejection,(event){console.error(Unhandled Promise Rejection:,event.reason)errorLogger.log(event.reasoninstanceofError?event.reason:newError(String(event.reason)),Unhandled Promise Rejection)// 阻止默认行为显示控制台错误event.preventDefault()})// 安全执行 PromiseexportasyncfunctionsafeAsyncT(promise:PromiseT,fallback?:T):PromiseT|undefined{try{returnawaitpromise}catch(error){errorLogger.log(errorinstanceofError?error:newError(String(error)),Safe Async)returnfallback}}// Promise 包装函数exportfunctiontoT(promise:PromiseT):Promise[Error|null,T|null]{returnpromise.then[null,T]((data)[null,data]).catch[Error,null]((err)[err,null])}4. API 请求错误处理// src/utils/request.tsimport{errorLogger}from./errorHandlerimport{ElMessage}fromelement-plusinterfaceRequestOptions{showError?:booleanerrorContext?:string}exportasyncfunctionrequestT(url:string,options:RequestOptions{}):PromiseT{const{showErrortrue,errorContextAPI Request}optionstry{constresponseawaitfetch(url)if(!response.ok){consterrornewError(HTTP${response.status}:${response.statusText})errorLogger.log(error,errorContext)if(showError){ElMessage.error(请求失败:${error.message})}throwerror}returnawaitresponse.json()}catch(error){if(errorinstanceofError){errorLogger.log(error,errorContext)if(showError!error.message.includes(HTTP)){ElMessage.error(网络请求失败请检查网络连接)}}throwerror}}// 使用示例asyncfunctionfetchArticle(id:string){returnrequestArticle(/api/articles/${id},{showError:true,errorContext:fetchArticle})}5. 资源加载错误处理// src/composables/useResourceError.tsimport{onMounted,onErrorCaptured}fromvueexportfunctionuseResourceError(){// 图片加载失败functionhandleImageError(event:Event){constimgevent.targetasHTMLImageElement img.src/default-image.png// 默认图片img.classList.add(error-loaded)}// 脚本加载失败functionloadScript(src:string):Promisevoid{returnnewPromise((resolve,reject){constscriptdocument.createElement(script)script.srcsrc script.onload()resolve()script.onerror(){reject(newError(Failed to load script:${src}))}document.head.appendChild(script)})}// Vue 组件内错误捕获onErrorCaptured((err,instance,info){console.error(Captured in component:,err)console.error(Component:,instance)console.error(Info:,info)// 返回 false 阻止错误继续传播returnfalse})return{handleImageError,loadScript}}6. 错误边界组件!-- src/components/ErrorBoundary.vue -- template slot v-if!hasError / div v-else classerror-boundary div classerror-content div classerror-icon/div h2页面出现了一些问题/h2 p别担心这只是一个小插曲/p div classerror-actions el-button typeprimary clickhandleRetry 重试一下 /el-button el-button clickhandleGoHome 返回首页 /el-button /div details v-ifshowDetails classerror-details summary查看错误详情/summary pre{{ errorMessage }}/pre /details /div /div /template script setup langts import { ref, onErrorCaptured } from vue import { useRouter } from vue-router const router useRouter() const hasError ref(false) const errorMessage ref() const showDetails ref(false) onErrorCaptured((err, instance, info) { hasError.value true errorMessage.value ${err.message}\n\nComponent: ${instance?.$options?.name || Unknown}\nInfo: ${info} console.error(ErrorBoundary caught:, err) // 返回 false 阻止错误传播 return false }) function handleRetry() { hasError.value false errorMessage.value } function handleGoHome() { hasError.value false router.push(/) } /script style scoped .error-boundary { display: flex; align-items: center; justify-content: center; min-height: 400px; padding: 40px; } .error-content { text-align: center; max-width: 400px; } .error-icon { font-size: 64px; margin-bottom: 20px; } .error-content h2 { margin: 0 0 8px; font-size: 24px; } .error-content p { color: #666; margin-bottom: 24px; } .error-actions { display: flex; gap: 12px; justify-content: center; margin-bottom: 24px; } .error-details { text-align: left; margin-top: 20px; } .error-details pre { background: #f5f5f5; padding: 16px; border-radius: 8px; overflow-x: auto; font-size: 12px; } /style7. 使用 ErrorBoundary!-- src/App.vue -- template ErrorBoundary router-view / /ErrorBoundary /template script setup langts import ErrorBoundary from /components/ErrorBoundary.vue /script错误监控服务推荐工具Sentry- 功能强大的错误追踪服务FunDebug- 国产前端监控工具Badjs- 腾讯开源的前端监控Sentry 集成npminstallsentry/vue sentry/tracing// src/utils/sentry.tsimport*asSentryfromsentry/vueimport{BrowserTracing}fromsentry/tracingexportfunctioninitSentry(app:any){Sentry.init({app,dsn:YOUR_SENTRY_DSN,integrations:[newBrowserTracing({routingInstrumentation:Sentry.vueRouterInstrumentation(router),}),],environment:import.meta.env.MODE,beforeSend(event){// 过滤非关键错误if(event.exception?.values?.[0]?.typeAbortError){returnnull}returnevent}})}最佳实践始终在 Promise 后添加 .catch()使用 try-catch 包装异步代码提供用户友好的错误提示记录详细错误日志便于调试相关资源Sentrysentry.ioFunDebugfundebug.com

相关文章:

Vue 3 项目错误处理实战:Vue ErrorHandler、Promise 监控、用户友好提示

前言 一个健壮的错误处理机制可以提升用户体验,帮助开发者快速定位问题。今天分享如何实现完善的错误处理和监控! 错误分类 错误类型 ├── Vue 渲染错误 │ ├── 组件渲染错误 │ ├── 生命周期钩子错误 │ └── 模板语法错误 ├── J…...

告别集中式服务器:聊聊Kimera-Multi如何用分布式PGO实现高效多机协同建图

分布式SLAM革命:Kimera-Multi如何重塑多机器人协同建图的技术边界 当五个勘探机器人在塌方后的矿井中失去与地面基站的连接时,它们的命运取决于一项关键技术——能否在不依赖中央服务器的情况下,仅通过彼此间的有限通信完成地下三维地图的精准…...

求推荐几款适合毕业论文使用的双效降重工具(降重复+降AI率)

现在高校毕业论文双重严查:既要查重复率,又要查AI 生成率,单纯改同义词已经完全没用!很多同学 AI 初稿写完,重复率 40%、AI 率 60%,改到崩溃还是过不了检测。本文精选PaperRed、笔捷 AI、豆包、DeepSeek、Q…...

从“鱼和熊掌”到“帕累托最优”:NSGA-II算法如何帮你做更好的设计决策?

从“鱼和熊掌”到“帕累托最优”:NSGA-II算法如何帮你做更好的设计决策? 在产品设计和工程决策中,我们常常面临多个相互矛盾的目标。比如设计一款软件时,性能、安全性、开发成本往往难以兼得;规划微服务架构时&#xf…...

Citra模拟器完整教程:在PC上高效运行3DS游戏的实用指南

Citra模拟器完整教程:在PC上高效运行3DS游戏的实用指南 【免费下载链接】citra A Nintendo 3DS Emulator 项目地址: https://gitcode.com/gh_mirrors/cit/citra 想要在电脑上重温任天堂3DS的经典游戏吗?Citra模拟器为您提供了完美的解决方案&…...

终极神界模组管理器完全指南:轻松管理《神界:原罪2》模组生态

终极神界模组管理器完全指南:轻松管理《神界:原罪2》模组生态 【免费下载链接】DivinityModManager A mod manager for Divinity: Original Sin - Definitive Edition. 项目地址: https://gitcode.com/gh_mirrors/di/DivinityModManager Divinity…...

终极AutoGPT身份认证实战指南:从JWT配置到安全验证的完整教程

终极AutoGPT身份认证实战指南:从JWT配置到安全验证的完整教程 【免费下载链接】AutoGPT AutoGPT is the vision of accessible AI for everyone, to use and to build on. Our mission is to provide the tools, so that you can focus on what matters. 项目地址…...

Vue+ElementUI后台管理系统:解决企业级应用快速部署难题的技术方案

VueElementUI后台管理系统:解决企业级应用快速部署难题的技术方案 【免费下载链接】vue-backend 简单的后台管理框架 项目地址: https://gitcode.com/gh_mirrors/vu/vue-backend 在数字化转型浪潮中,企业面临着后台管理系统开发周期长、维护成本高…...

终极指南:如何解决GPT4Free异步事件循环关闭难题

终极指南:如何解决GPT4Free异步事件循环关闭难题 【免费下载链接】gpt4free The official gpt4free repository | various collection of powerful language models | opus 4.6 gpt 5.3 kimi 2.5 deepseek v3.2 gemini 3 项目地址: https://gitcode.com/GitHub_Tr…...

GAN七日实战:从原理到风格迁移的完整学习路径

1. 生成对抗网络入门指南:7天速成实战路线第一次接触GAN时,我被它生成的人脸照片震惊得说不出话——那些根本不存在的人像,连皮肤纹理和发丝反光都真实得可怕。作为计算机视觉领域的革命性技术,生成对抗网络正在重塑内容创作的边界…...

终极解决方案:如何彻底修复Kitty终端Wayland环境窗口调整崩溃问题

终极解决方案:如何彻底修复Kitty终端Wayland环境窗口调整崩溃问题 【免费下载链接】kitty If you live in the terminal, kitty is made for you! Cross-platform, fast, feature-rich, GPU based. 项目地址: https://gitcode.com/GitHub_Trending/ki/kitty …...

FPGA开发者必看:Xilinx SRIO IP核的AXI4-Stream接口实战指南(含HELLO包时序详解)

FPGA开发者实战指南:Xilinx SRIO IP核AXI4-Stream接口深度解析 在高速嵌入式系统设计中,芯片间通信的带宽和延迟往往是性能瓶颈的关键所在。Xilinx的Serial RapidIO(SRIO)IP核为解决这一挑战提供了高效解决方案,尤其适…...

华为---RSTP(一)---从STP痛点看RSTP的革新

1. STP的痛点:为什么我们需要RSTP? 第一次接触STP(生成树协议)时,我被它优雅的环路消除机制惊艳到了。但真正把它部署到生产环境后,才发现这个"优雅"的代价有多大。记得有次凌晨割接&#xff0c…...

终极PL2303驱动解决方案:让Windows 10/11完美识别老旧串口设备

终极PL2303驱动解决方案:让Windows 10/11完美识别老旧串口设备 【免费下载链接】pl2303-win10 Windows 10 driver for end-of-life PL-2303 chipsets. 项目地址: https://gitcode.com/gh_mirrors/pl/pl2303-win10 你是否在Windows 10或11系统中遇到了PL2303串…...

告别刹车油!聊聊EMB电子机械制动如何让汽车更‘干爽’、更环保

告别刹车油!EMB电子机械制动如何重塑汽车环保新时代 当你在4S店为爱车做保养时,是否曾被维修师傅提醒"该换刹车油了"?那一小瓶价格不菲的液体,不仅需要定期更换,一旦泄漏还会腐蚀车漆、污染环境。传统液压制…...

别再花钱买教程了!手把手教你用B站免费视频搞定NVivo 12/14中文版安装与基础设置

零成本掌握NVivo:B站资源实战指南解锁质性研究全流程 第一次打开NVivo时,那个布满英文术语的界面就像一堵高墙。记得我研究生时期为了分析30份访谈记录,对着软件发呆两小时却连基础编码都没完成——直到发现B站上那些被忽略的免费教程宝藏。…...

Windows系统配置自动化工具:WinUtil深度技术解析与实战指南

Windows系统配置自动化工具:WinUtil深度技术解析与实战指南 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 技术挑战与解决方案定…...

马斯克的600亿阳谋:先绑Cursor,再决定吞不吞

4月23日,公开报道里最核心的结构是:SpaceX 拿到了今年晚些时候以 600 亿美元收购 Cursor 的期权;如果不走收购路径,则可支付 100 亿美元作为战略合作费用。 同时,合作对外的主叙事是:Cursor 提供产品、工程…...

5分钟快速上手:通达信缠论分析插件完整指南

5分钟快速上手:通达信缠论分析插件完整指南 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 你是否曾经面对复杂的K线图感到无从下手?是否想要掌握缠论分析却苦于手动画图的繁琐&a…...

如何快速为所有Win32应用添加Mica效果:Mica For Everyone完整指南

如何快速为所有Win32应用添加Mica效果:Mica For Everyone完整指南 【免费下载链接】MicaForEveryone Mica For Everyone is a tool to enable backdrop effects on the title bars of Win32 apps on Windows 11. 项目地址: https://gitcode.com/gh_mirrors/mi/Mic…...

突破性能瓶颈:10个关键技巧优化ASP.NET Core中HTTP.sys编码URL处理性能

突破性能瓶颈:10个关键技巧优化ASP.NET Core中HTTP.sys编码URL处理性能 【免费下载链接】aspnetcore ASP.NET Core is a cross-platform .NET framework for building modern cloud-based web applications on Windows, Mac, or Linux. 项目地址: https://gitcode…...

WarcraftHelper:3步解决魔兽争霸3在Win10/Win11上的兼容性问题

WarcraftHelper:3步解决魔兽争霸3在Win10/Win11上的兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代系统…...

C语言结构体对齐毁掉你的LLM推理?深度解析__attribute__((packed))在Flash映射中的致命副作用

第一章:C语言结构体对齐毁掉你的LLM推理?深度解析__attribute__((packed))在Flash映射中的致命副作用当嵌入式设备(如边缘AI加速器)将量化后的LLM权重直接从Flash内存映射为只读结构体数组时,结构体对齐策略可能引发灾…...

告别先查后改!用MyBatis-Plus-Plus实现复合主键批量更新,性能提升实测

告别先查后改!用MyBatis-Plus-Plus实现复合主键批量更新,性能提升实测 在数据密集型应用中,批量更新操作往往是性能瓶颈所在。当数据量达到万级甚至十万级时,传统的"先查询再修改"模式会带来巨大的数据库压力。本文将深…...

别再只盯着Grad-CAM了!用OpenCV的applyColorMap函数,5分钟搞定PyTorch模型的特征图可视化

5分钟实现PyTorch特征图可视化:OpenCV高阶玩法全解析 在调试深度学习模型时,我们常常需要确认模型是否真正"看"到了图像的关键区域。传统方法如Grad-CAM虽然功能强大,但对于快速验证和日常调试来说,往往显得过于笨重。今…...

如何用WinUtil:一键解决Windows系统管理的终极指南

如何用WinUtil:一键解决Windows系统管理的终极指南 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 还在为Windows系统管理而烦恼吗…...

如何快速解决Windows热键冲突:Hotkey Detective智能检测工具完全指南

如何快速解决Windows热键冲突:Hotkey Detective智能检测工具完全指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective…...

Golang怎么读取环境变量_Golang如何用os.Getenv获取系统环境变量【基础】

os.Getenv读不到变量是因为进程只继承启动时的环境快照,需确认变量已生效;其返回空字符串无法区分“未设置”和“值为空”,应改用os.LookupEnv判断存在性。os.Getenv 读不到变量?先确认它真在进程环境里Go 程序启动时会拷贝父进程…...

抖音下载器完整教程:3分钟掌握免费批量下载技巧

抖音下载器完整教程:3分钟掌握免费批量下载技巧 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖…...

WaveTools鸣潮工具箱:一键解锁120FPS,打造极致游戏体验的完整指南

WaveTools鸣潮工具箱:一键解锁120FPS,打造极致游戏体验的完整指南 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》玩家设计的开源性能优化工具箱&#…...