148 lines
3.9 KiB
JavaScript
148 lines
3.9 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;
|