ForcePilot/web/src/utils/errorHandler.js
2026-01-15 06:01:34 +08:00

148 lines
3.8 KiB
JavaScript

import { message } from 'ant-design-vue'
/**
* 统一错误处理工具类
*/
export class ErrorHandler {
/**
* 处理通用错误
* @param {Error} error - 错误对象
* @param {string} context - 错误上下文
* @param {Object} options - 配置选项
*/
static handleError(error, context = '操作', options = {}) {
const {
showMessage = true,
logToConsole = true,
customMessage = null,
severity = 'error'
} = options
// 控制台日志
if (logToConsole) {
console.error(`${context}失败:`, error)
}
// 用户提示
if (showMessage) {
const displayMessage = customMessage || this.getErrorMessage(error, context)
switch (severity) {
case 'warning':
message.warning(displayMessage)
break
case 'info':
message.info(displayMessage)
break
case 'error':
default:
message.error(displayMessage)
break
}
}
return error
}
/**
* 获取错误消息
* @param {Error} error - 错误对象
* @param {string} context - 错误上下文
* @returns {string} 错误消息
*/
static getErrorMessage(error, context) {
if (error?.message) {
return `${context}失败: ${error.message}`
}
return `${context}失败`
}
/**
* 处理网络请求错误
* @param {Error} error - 错误对象
* @param {string} context - 错误上下文
*/
static handleNetworkError(error, context = '网络请求') {
let customMessage = null
if (error?.code === 'NETWORK_ERROR') {
customMessage = '网络连接失败,请检查网络设置'
} else if (error?.status === 401) {
customMessage = '认证失败,请重新登录'
} else if (error?.status === 403) {
customMessage = '权限不足,无法执行此操作'
} else if (error?.status === 404) {
customMessage = '请求的资源不存在'
} else if (error?.status >= 500) {
customMessage = '服务器错误,请稍后重试'
}
return this.handleError(error, context, { customMessage })
}
/**
* 处理聊天相关错误
* @param {Error} error - 错误对象
* @param {string} operation - 操作类型
*/
static handleChatError(error, operation) {
const contextMap = {
send: '发送消息',
create: '创建对话',
delete: '删除对话',
rename: '重命名对话',
load: '加载对话',
export: '导出对话',
stream: '流式处理'
}
const context = contextMap[operation] || operation
return this.handleError(error, context)
}
/**
* 处理验证错误
* @param {string} message - 验证错误消息
*/
static handleValidationError(message) {
return this.handleError(new Error(message), '输入验证', {
severity: 'warning',
customMessage: message
})
}
/**
* 处理异步操作错误
* @param {Function} asyncFn - 异步函数
* @param {string} context - 错误上下文
* @param {Object} options - 配置选项
*/
static async handleAsync(asyncFn, context, options = {}) {
try {
return await asyncFn()
} catch (error) {
this.handleError(error, context, options)
throw error
}
}
/**
* 创建错误处理装饰器
* @param {string} context - 错误上下文
* @param {Object} options - 配置选项
*/
static createHandler(context, options = {}) {
return (error) => this.handleError(error, context, options)
}
}
/**
* 快捷方法
*/
export const handleChatError = ErrorHandler.handleChatError.bind(ErrorHandler)
export const handleNetworkError = ErrorHandler.handleNetworkError.bind(ErrorHandler)
export const handleValidationError = ErrorHandler.handleValidationError.bind(ErrorHandler)
export const handleAsync = ErrorHandler.handleAsync.bind(ErrorHandler)
export default ErrorHandler