123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /**
- * 错误处理工具类
- */
- // 错误码映射表
- const ERROR_CODE_MAP = {
- 401: '登录已过期,请重新登录',
- 403: '没有权限执行此操作',
- // 404: '请求的资源不存在',
- 500: '服务器错误,请稍后重试',
- 502: '网关错误',
- 503: '服务不可用,请稍后重试',
- 504: '网关超时'
- };
- // 业务错误码映射表(根据实际业务定义)
- const BUSINESS_ERROR_CODE_MAP = {
- 10001: '用户名或密码错误',
- 10002: '账号已被禁用',
- 10003: '验证码错误',
- 10004: '操作过于频繁,请稍后再试',
- // 添加更多业务错误码...
- };
- class ErrorHandler {
- constructor() {
- // 记录最后显示的错误信息和时间,避免重复显示
- this.lastMessage = '';
- this.lastTime = 0;
- }
-
- /**
- * 显示错误提示
- * @param {string} message - 错误信息
- * @param {number} duration - 显示时长
- */
- showError(message, duration = 2000) {
- // 避免重复显示相同的错误提示
- if (this.lastMessage === message && Date.now() - this.lastTime < 3000) {
- return;
- }
-
- uni.showToast({
- title: message,
- icon: 'none',
- duration: duration
- });
-
- // 记录最后显示的错误信息和时间
- this.lastMessage = message;
- this.lastTime = Date.now();
- }
-
- /**
- * 处理HTTP错误
- * @param {number} statusCode - HTTP状态码
- * @param {Object} response - 响应对象
- * @returns {Error} - 格式化的错误对象
- */
- handleHttpError(statusCode, response) {
- const errorMsg = ERROR_CODE_MAP[statusCode] || `网络请求错误:${statusCode}`;
- this.showError(errorMsg);
-
- const error = new Error(errorMsg);
- error.code = statusCode;
- error.response = response;
-
- // 特殊处理401未授权错误
- if (statusCode === 401) {
- this.handleUnauthorized();
- }
-
- return error;
- }
-
- /**
- * 处理业务错误
- * @param {Object} data - 业务响应数据
- * @returns {Error} - 格式化的错误对象
- */
- handleBusinessError(data) {
- const errorMsg = BUSINESS_ERROR_CODE_MAP[data.code] || data.msg || '请求失败';
- this.showError(errorMsg);
-
- const error = new Error(errorMsg);
- error.code = data.code;
- error.data = data;
-
- return error;
- }
-
- /**
- * 处理网络请求失败
- * @param {Object} err - 原始错误对象
- * @returns {Error} - 格式化的错误对象
- */
- handleRequestFail(err) {
- let errorMsg = '网络请求失败,请检查网络连接';
-
- // 根据错误类型提供更具体的错误信息
- if (err.errMsg) {
- if (err.errMsg.includes('timeout')) {
- errorMsg = '请求超时,请检查网络连接';
- } else if (err.errMsg.includes('abort')) {
- errorMsg = '请求已取消';
- } else if (err.errMsg.includes('SSL')) {
- errorMsg = '网络安全证书错误';
- }
- }
-
- this.showError(errorMsg);
-
- const error = new Error(errorMsg);
- error.original = err;
- return error;
- }
-
- /**
- * 处理未授权错误(401)
- */
- handleUnauthorized() {
- // 清除登录信息
- uni.removeStorageSync('token');
- uni.removeStorageSync('userInfo');
-
- // 跳转到登录页
- setTimeout(() => {
- uni.navigateTo({
- url: '/pages/login/login'
- });
- }, 1500);
- }
-
- /**
- * 记录错误日志
- * @param {Error} error - 错误对象
- * @param {string} source - 错误来源
- */
- logError(error, source = 'unknown') {
- console.error(`[${source}] Error:`, error);
-
- // 这里可以添加错误上报逻辑
- // 例如发送到服务器或第三方监控平台
- }
- }
- // 创建单例
- const errorHandler = new ErrorHandler();
- export default errorHandler;
|