From f16a1da324122dfa9a6859f34753e919b6c1001a Mon Sep 17 00:00:00 2001 From: Azir-11 <2075125282@qq.com> Date: Wed, 1 Oct 2025 20:18:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=85=A8=E5=B1=80?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86=E6=9C=BA=E5=88=B6=EF=BC=8C?= =?UTF-8?q?=E6=8D=95=E8=8E=B7=20Vue=20=E5=92=8C=20JS=20=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/src/core/error-handel.js | 51 ++++++++++++++++++++++++++++++++++++ web/src/main.js | 5 ++++ 2 files changed, 56 insertions(+) create mode 100644 web/src/core/error-handel.js diff --git a/web/src/core/error-handel.js b/web/src/core/error-handel.js new file mode 100644 index 0000000000..9c06e95356 --- /dev/null +++ b/web/src/core/error-handel.js @@ -0,0 +1,51 @@ +function sendErrorTip(errorInfo) { + console.groupCollapsed(`捕获到错误: ${errorInfo.type}`); + console.log('错误类型:', errorInfo.type); + console.log('错误信息:', errorInfo.message); + console.log('调用栈:', errorInfo.stack); + if (errorInfo.component) { + console.log('组件名:', errorInfo.component.name) + console.log('组件地址:', errorInfo.component.__file) + } + if (errorInfo.vueInfo) console.log('Vue 信息:', errorInfo.vueInfo); + if (errorInfo.source) console.log('来源文件:', errorInfo.source); + if (errorInfo.lineno) console.log('行号:', errorInfo.lineno); + if (errorInfo.colno) console.log('列号:', errorInfo.colno); + console.groupEnd(); +} + +function initVueErrorHandler(app) { + app.config.errorHandler = (err, vm, info) => { + let errorType = 'Vue Error'; + + sendErrorTip({ + type: errorType, + message: err.message, + stack: err.stack, + component: vm.$options || 'Unknown Vue Component', + vueInfo: info + }); + }; +} + +function initJsErrorHandler() { + window.onerror = (message, source, lineno, colno, error) => { + let errorType = 'JS Error'; + + sendErrorTip({ + type: errorType, + message: message, + stack: error ? error.stack : 'No stack available', + source: source, + lineno: lineno, + colno: colno + }); + + return false; + }; +} + +export function initErrorHandler(app) { + initVueErrorHandler(app) + initJsErrorHandler() +} diff --git a/web/src/main.js b/web/src/main.js index 8ecb37bd7a..1ba53c9e2d 100644 --- a/web/src/main.js +++ b/web/src/main.js @@ -15,8 +15,13 @@ import auth from '@/directive/auth' import clickOutSide from '@/directive/clickOutSide' import { store } from '@/pinia' import App from './App.vue' +import { initErrorHandler } from '@/core/error-handel' + const app = createApp(App) + +// 注入错误处理捕获 +initErrorHandler(app) app.config.productionTip = false app