Procházet zdrojové kódy

feat (1.31.1 -> 1.32.0): 实现全局错误处理功能

- 在 main.js 中添加 Electron 主进程错误处理
- 在 src/app.tsx 中集成浏览器错误处理
- 新增 src/utils/errorHandler.ts 浏览器错误处理工具

改动文件:

- main.js
- src/app.tsx
- src/utils/errorHandler.ts
dengdx před 2 týdny
rodič
revize
6ecdaea399
5 změnil soubory, kde provedl 92 přidání a 1 odebrání
  1. 21 0
      CHANGELOG.md
  2. 22 0
      main.js
  3. 1 1
      package.json
  4. 4 0
      src/app.tsx
  5. 44 0
      src/utils/errorHandler.ts

+ 21 - 0
CHANGELOG.md

@@ -2,6 +2,27 @@
 
 本项目的所有重要变更都将记录在此文件中。
 
+## [1.32.0] - 2025-12-26 20:37
+
+### 新增 (Added)
+- **全局错误处理功能** - 实现完整的应用错误捕获和处理机制
+  - 在 Electron 主进程中添加 uncaughtException、unhandledRejection、render-process-gone、child-process-gone 事件监听
+  - 在浏览器环境中添加 uncaught_error 和 unhandled_rejection 事件监听
+  - 创建全局错误处理工具类,支持日志记录和错误信息格式化
+  - 在应用初始化时自动设置全局错误监听器
+
+**核心改进:**
+- 系统稳定性提升:全面捕获和记录应用运行时的各类错误
+- 错误追踪能力增强:详细的错误信息记录,便于问题排查和调试
+- 用户体验优化:优雅的错误处理,避免应用崩溃影响正常使用
+- 开发调试便利:结构化的错误日志输出,支持不同环境下的错误监控
+
+**改动文件:**
+- main.js
+- src/app.tsx
+- src/utils/errorHandler.ts
+- package.json (版本更新: 1.31.1 -> 1.32.0)
+
 ## [1.31.1] - 2025-12-26 19:21
 
 ### 修复 (Fixed)

+ 22 - 0
main.js

@@ -10,6 +10,28 @@ import { writeFileSync } from 'fs';
 import fs from 'fs';
 import path from 'path';
 
+// -------------- 全局错误处理 --------------
+process.on('uncaughtException', (error) => {
+  writeLog('fatal', `未捕获的异常: ${error.message}\n${error.stack}`);
+  // 在生产环境中,可以选择退出应用
+  if (process.env.NODE_ENV === 'production') {
+    app.quit();
+  }
+});
+
+process.on('unhandledRejection', (reason, promise) => {
+  writeLog('error', `未处理的Promise拒绝: ${reason}\nPromise: ${promise}`);
+});
+
+// 监听应用崩溃
+app.on('render-process-gone', (event, webContents, details) => {
+  writeLog('fatal', `渲染进程崩溃: ${JSON.stringify(details)}`);
+});
+
+app.on('child-process-gone', (event, childProcess, details) => {
+  writeLog('error', `子进程崩溃: ${JSON.stringify(details)}`);
+});
+
 // -------------- 构造 ESM 版 __dirname --------------
 const __filename = fileURLToPath(import.meta.url);
 const __dirname = dirname(__filename);

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "zsis",
-  "version": "1.31.1",
+  "version": "1.32.0",
   "private": true,
   "description": "医学成像系统",
   "main": "main.js",

+ 4 - 0
src/app.tsx

@@ -22,6 +22,7 @@ import { setBusinessFlow } from './states/BusinessFlowSlice';
 import { logger } from './log/logger';
 import { theme } from 'antd';
 import { getAntdLocale, setDayjsLocale } from './utils/localeHelper';
+import { setupGlobalErrorHandlers } from './utils/errorHandler';
 import ServerConfigModal from './features/serverConfig/components/ServerConfigModal';
 console.log = logger.log;
 console.warn = logger.warn;
@@ -30,6 +31,9 @@ console.debug = logger.debug;
 console.log(`process.env.USE_MSW: ${process.env.USE_MSW}`);
 console.log(`process.env.NODE_ENV: ${process.env.NODE_ENV}`);
 console.debug('debug level')
+
+// 设置全局错误处理监听器
+setupGlobalErrorHandlers();
 if (process.env.NODE_ENV === 'development' && process.env.USE_MSW === 'true') {
   import('../mocks/server')
     .then(({ server }): void => {

+ 44 - 0
src/utils/errorHandler.ts

@@ -0,0 +1,44 @@
+import { logger } from '../log/logger';
+
+/**
+ * 设置全局错误处理监听器
+ * 只在浏览器环境中生效
+ */
+export const setupGlobalErrorHandlers = () => {
+  // 只在浏览器环境中设置全局错误处理
+  if (typeof window === 'undefined') return;
+
+  // 处理未捕获的JavaScript错误和资源加载错误
+  window.addEventListener('error', (event) => {
+    const errorInfo = {
+      type: 'uncaught_error',
+      message: event.message,
+      filename: event.filename,
+      lineno: event.lineno,
+      colno: event.colno,
+      stack: event.error?.stack,
+      timestamp: new Date().toISOString()
+    };
+
+    logger.error('全局错误捕获', errorInfo);
+
+    // 可以选择是否阻止默认错误处理
+    // event.preventDefault();
+  });
+
+  // 处理未处理的Promise拒绝
+  window.addEventListener('unhandledrejection', (event) => {
+    const errorInfo = {
+      type: 'unhandled_rejection',
+      reason: event.reason,
+      timestamp: new Date().toISOString()
+    };
+
+    logger.error('未处理的Promise拒绝', errorInfo);
+
+    // 可以选择是否阻止默认错误处理
+    // event.preventDefault();
+  });
+
+  logger.log('全局错误处理监听器已设置');
+};