Skip to content

HTTP错误处理机制2024:Vue项目错误处理完整指南

📊 SEO元描述:2024年最新HTTP错误处理教程,详解Vue项目错误捕获、重试机制、用户反馈。包含完整错误处理案例,适合Vue.js开发者构建健壮的错误处理系统。

核心关键词:HTTP错误处理 2024、Vue错误处理、Axios错误处理、请求重试机制、错误捕获、前端异常处理

长尾关键词:Vue HTTP错误怎么处理、Axios错误处理最佳实践、前端请求重试机制、Vue异常捕获方法、HTTP错误用户反馈


📚 HTTP错误处理机制学习目标与核心收获

通过本节HTTP错误处理机制,你将系统性掌握:

  • 错误类型识别:理解不同类型的HTTP错误和网络异常
  • 错误捕获机制:掌握全局和局部错误捕获的方法
  • 重试策略设计:实现智能的请求重试和退避算法
  • 用户反馈系统:构建友好的错误提示和用户引导
  • 错误日志记录:建立完整的错误监控和日志系统
  • 降级处理方案:实现服务降级和容错机制

🎯 适合人群

  • Vue.js开发者的错误处理需求
  • 前端架构师的系统稳定性设计
  • 全栈开发者的前后端错误协调
  • 运维开发者的前端监控和日志管理

🌟 错误处理机制是什么?为什么重要?

错误处理机制是什么?这是确保应用稳定性和用户体验的关键技术。错误处理机制是系统性地捕获、处理和恢复各种错误情况的完整方案,也是企业级应用不可缺少的基础设施。

错误处理机制的核心价值

  • 🎯 用户体验保障:提供友好的错误提示和恢复指导
  • 🔧 系统稳定性:防止单个错误导致整个应用崩溃
  • 💡 问题快速定位:通过日志和监控快速定位问题
  • 📚 业务连续性:通过降级和重试保证业务正常运行
  • 🚀 开发效率提升:统一的错误处理减少重复代码

💡 学习建议:错误处理是系统工程,建议从基础错误捕获开始,逐步构建完整的错误处理体系

错误类型分析

HTTP错误分类

javascript
// 🎉 HTTP错误类型分析
const httpErrorTypes = {
  // 网络错误
  network: {
    code: 'NETWORK_ERROR',
    description: '网络连接失败',
    causes: ['网络断开', 'DNS解析失败', '服务器不可达'],
    solutions: ['检查网络连接', '重试请求', '切换网络']
  },
  
  // 超时错误
  timeout: {
    code: 'TIMEOUT_ERROR',
    description: '请求超时',
    causes: ['网络延迟', '服务器响应慢', '请求数据量大'],
    solutions: ['增加超时时间', '重试请求', '优化请求']
  },
  
  // 客户端错误 (4xx)
  client: {
    400: { message: '请求参数错误', action: 'CHECK_PARAMS' },
    401: { message: '未授权访问', action: 'REDIRECT_LOGIN' },
    403: { message: '禁止访问', action: 'SHOW_PERMISSION_ERROR' },
    404: { message: '资源不存在', action: 'SHOW_NOT_FOUND' },
    422: { message: '数据验证失败', action: 'SHOW_VALIDATION_ERROR' },
    429: { message: '请求过于频繁', action: 'RETRY_WITH_DELAY' }
  },
  
  // 服务器错误 (5xx)
  server: {
    500: { message: '服务器内部错误', action: 'RETRY_REQUEST' },
    502: { message: '网关错误', action: 'RETRY_REQUEST' },
    503: { message: '服务不可用', action: 'SHOW_MAINTENANCE' },
    504: { message: '网关超时', action: 'RETRY_REQUEST' }
  }
}

错误严重级别

javascript
// 🎉 错误严重级别定义
const errorSeverity = {
  CRITICAL: {
    level: 1,
    description: '严重错误,影响核心功能',
    actions: ['立即重试', '降级处理', '用户通知'],
    examples: ['支付失败', '登录失败', '数据丢失']
  },
  
  HIGH: {
    level: 2,
    description: '高级错误,影响重要功能',
    actions: ['重试请求', '缓存降级', '错误提示'],
    examples: ['数据加载失败', '文件上传失败']
  },
  
  MEDIUM: {
    level: 3,
    description: '中级错误,影响部分功能',
    actions: ['静默重试', '默认数据', '后台记录'],
    examples: ['推荐数据失败', '统计数据失败']
  },
  
  LOW: {
    level: 4,
    description: '低级错误,不影响主要功能',
    actions: ['后台记录', '静默处理'],
    examples: ['埋点上报失败', '非关键数据失败']
  }
}

全局错误处理

Vue全局错误处理

javascript
// 🎉 Vue全局错误处理配置
// main.js
import { createApp } from 'vue'
import App from './App.vue'
import { setupErrorHandler } from './utils/errorHandler'

const app = createApp(App)

// 设置全局错误处理
app.config.errorHandler = (err, instance, info) => {
  console.error('Vue全局错误:', err)
  console.error('错误信息:', info)
  console.error('组件实例:', instance)
  
  // 发送错误到监控系统
  sendErrorToMonitoring({
    type: 'VUE_ERROR',
    error: err.message,
    stack: err.stack,
    info: info,
    url: window.location.href,
    userAgent: navigator.userAgent,
    timestamp: new Date().toISOString()
  })
}

// 设置全局未捕获的Promise错误
window.addEventListener('unhandledrejection', (event) => {
  console.error('未捕获的Promise错误:', event.reason)
  
  // 发送错误到监控系统
  sendErrorToMonitoring({
    type: 'PROMISE_ERROR',
    error: event.reason,
    url: window.location.href,
    timestamp: new Date().toISOString()
  })
  
  // 阻止默认的错误处理
  event.preventDefault()
})

// 设置全局JavaScript错误
window.addEventListener('error', (event) => {
  console.error('全局JavaScript错误:', event.error)
  
  sendErrorToMonitoring({
    type: 'JS_ERROR',
    error: event.error?.message || event.message,
    stack: event.error?.stack,
    filename: event.filename,
    lineno: event.lineno,
    colno: event.colno,
    timestamp: new Date().toISOString()
  })
})

app.mount('#app')

错误处理工具类

javascript
// 🎉 错误处理工具类
// utils/errorHandler.js
import { ElMessage, ElNotification } from 'element-plus'
import router from '@/router'
import store from '@/store'

class ErrorHandler {
  constructor() {
    this.errorQueue = []
    this.isProcessing = false
    this.retryConfig = {
      maxRetries: 3,
      baseDelay: 1000,
      maxDelay: 10000
    }
  }
  
  // 处理HTTP错误
  handleHttpError(error) {
    const { response, request, config } = error
    
    if (response) {
      // 服务器响应错误
      return this.handleResponseError(response, config)
    } else if (request) {
      // 网络错误
      return this.handleNetworkError(error, config)
    } else {
      // 请求配置错误
      return this.handleConfigError(error, config)
    }
  }
  
  // 处理响应错误
  handleResponseError(response, config) {
    const { status, data } = response
    const errorInfo = {
      type: 'RESPONSE_ERROR',
      status,
      message: data?.message || this.getStatusMessage(status),
      url: config?.url,
      method: config?.method?.toUpperCase()
    }
    
    switch (status) {
      case 400:
        this.showValidationError(data)
        break
      case 401:
        this.handleUnauthorized()
        break
      case 403:
        this.handleForbidden()
        break
      case 404:
        this.handleNotFound(config?.url)
        break
      case 422:
        this.showValidationError(data)
        break
      case 429:
        this.handleRateLimit(config)
        break
      case 500:
      case 502:
      case 503:
      case 504:
        this.handleServerError(status, config)
        break
      default:
        this.showGenericError(errorInfo.message)
    }
    
    // 记录错误
    this.logError(errorInfo)
    
    return Promise.reject(errorInfo)
  }
  
  // 处理网络错误
  handleNetworkError(error, config) {
    const errorInfo = {
      type: 'NETWORK_ERROR',
      message: '网络连接失败,请检查网络设置',
      url: config?.url,
      method: config?.method?.toUpperCase()
    }
    
    // 显示网络错误提示
    ElMessage.error({
      message: errorInfo.message,
      duration: 5000,
      showClose: true
    })
    
    // 尝试重试
    if (this.shouldRetry(config)) {
      return this.retryRequest(config)
    }
    
    this.logError(errorInfo)
    return Promise.reject(errorInfo)
  }
  
  // 处理未授权
  handleUnauthorized() {
    ElMessage.error('登录已过期,请重新登录')
    
    // 清除用户信息
    store.dispatch('user/logout')
    
    // 跳转到登录页
    router.push({
      path: '/login',
      query: { redirect: router.currentRoute.value.fullPath }
    })
  }
  
  // 处理禁止访问
  handleForbidden() {
    ElNotification.error({
      title: '访问被拒绝',
      message: '您没有权限访问该资源,请联系管理员',
      duration: 0
    })
  }
  
  // 处理资源不存在
  handleNotFound(url) {
    ElMessage.warning(`请求的资源不存在: ${url}`)
  }
  
  // 处理验证错误
  showValidationError(data) {
    if (data?.errors && typeof data.errors === 'object') {
      // 显示详细验证错误
      const errorMessages = Object.values(data.errors).flat()
      errorMessages.forEach(message => {
        ElMessage.error(message)
      })
    } else {
      ElMessage.error(data?.message || '数据验证失败')
    }
  }
  
  // 处理频率限制
  handleRateLimit(config) {
    ElMessage.warning('请求过于频繁,请稍后再试')
    
    // 延迟重试
    if (this.shouldRetry(config)) {
      setTimeout(() => {
        this.retryRequest(config)
      }, 5000)
    }
  }
  
  // 处理服务器错误
  handleServerError(status, config) {
    const messages = {
      500: '服务器内部错误,请稍后重试',
      502: '网关错误,请稍后重试',
      503: '服务暂时不可用,请稍后重试',
      504: '请求超时,请稍后重试'
    }
    
    ElMessage.error(messages[status] || '服务器错误')
    
    // 自动重试
    if (this.shouldRetry(config)) {
      this.retryRequest(config)
    }
  }
  
  // 显示通用错误
  showGenericError(message) {
    ElMessage.error(message || '请求失败,请稍后重试')
  }
  
  // 获取状态码对应的消息
  getStatusMessage(status) {
    const messages = {
      400: '请求参数错误',
      401: '未授权访问',
      403: '禁止访问',
      404: '资源不存在',
      422: '数据验证失败',
      429: '请求过于频繁',
      500: '服务器内部错误',
      502: '网关错误',
      503: '服务不可用',
      504: '网关超时'
    }
    
    return messages[status] || `请求失败 (${status})`
  }
  
  // 判断是否应该重试
  shouldRetry(config) {
    if (!config || config._retryCount >= this.retryConfig.maxRetries) {
      return false
    }
    
    // 只对GET请求和幂等请求重试
    const retryableMethods = ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE']
    return retryableMethods.includes(config.method?.toUpperCase())
  }
  
  // 重试请求
  async retryRequest(config) {
    config._retryCount = (config._retryCount || 0) + 1
    
    // 计算延迟时间(指数退避)
    const delay = Math.min(
      this.retryConfig.baseDelay * Math.pow(2, config._retryCount - 1),
      this.retryConfig.maxDelay
    )
    
    console.log(`重试请求 ${config.url},第 ${config._retryCount} 次,延迟 ${delay}ms`)
    
    // 延迟后重试
    await new Promise(resolve => setTimeout(resolve, delay))
    
    // 重新发送请求
    return axios(config)
  }
  
  // 记录错误
  logError(errorInfo) {
    // 发送到监控系统
    this.sendToMonitoring(errorInfo)
    
    // 本地存储(用于离线分析)
    this.storeLocalError(errorInfo)
    
    // 开发环境控制台输出
    if (process.env.NODE_ENV === 'development') {
      console.group('🚨 HTTP错误详情')
      console.error('错误信息:', errorInfo)
      console.trace('错误堆栈')
      console.groupEnd()
    }
  }
  
  // 发送到监控系统
  sendToMonitoring(errorInfo) {
    // 这里可以集成第三方监控服务
    // 如 Sentry, LogRocket, Bugsnag 等
    
    if (window.Sentry) {
      window.Sentry.captureException(new Error(errorInfo.message), {
        tags: {
          type: errorInfo.type,
          status: errorInfo.status
        },
        extra: errorInfo
      })
    }
    
    // 或者发送到自己的监控接口
    fetch('/api/monitoring/errors', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        ...errorInfo,
        timestamp: new Date().toISOString(),
        userAgent: navigator.userAgent,
        url: window.location.href,
        userId: store.getters['user/userId']
      })
    }).catch(() => {
      // 监控接口失败时静默处理
    })
  }
  
  // 本地存储错误
  storeLocalError(errorInfo) {
    try {
      const errors = JSON.parse(localStorage.getItem('app_errors') || '[]')
      errors.push({
        ...errorInfo,
        timestamp: new Date().toISOString()
      })
      
      // 只保留最近100条错误
      if (errors.length > 100) {
        errors.splice(0, errors.length - 100)
      }
      
      localStorage.setItem('app_errors', JSON.stringify(errors))
    } catch (e) {
      // 存储失败时静默处理
    }
  }
}

export default new ErrorHandler()

重试机制实现

智能重试策略

javascript
// 🎉 智能重试策略
// utils/retryStrategy.js
class RetryStrategy {
  constructor(options = {}) {
    this.maxRetries = options.maxRetries || 3
    this.baseDelay = options.baseDelay || 1000
    this.maxDelay = options.maxDelay || 10000
    this.backoffFactor = options.backoffFactor || 2
    this.jitter = options.jitter || true
  }
  
  // 执行重试
  async execute(fn, context = {}) {
    let lastError
    
    for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
      try {
        const result = await fn()
        
        // 成功时记录重试信息
        if (attempt > 0) {
          console.log(`请求成功,重试了 ${attempt} 次`)
        }
        
        return result
      } catch (error) {
        lastError = error
        
        // 最后一次尝试失败
        if (attempt === this.maxRetries) {
          break
        }
        
        // 检查是否应该重试
        if (!this.shouldRetry(error, attempt, context)) {
          break
        }
        
        // 计算延迟时间
        const delay = this.calculateDelay(attempt)
        
        console.log(`请求失败,${delay}ms后进行第 ${attempt + 1} 次重试`)
        
        // 等待后重试
        await this.delay(delay)
      }
    }
    
    throw lastError
  }
  
  // 判断是否应该重试
  shouldRetry(error, attempt, context) {
    // 网络错误总是重试
    if (!error.response) {
      return true
    }
    
    const status = error.response.status
    
    // 可重试的状态码
    const retryableStatuses = [408, 429, 500, 502, 503, 504]
    
    if (retryableStatuses.includes(status)) {
      return true
    }
    
    // 根据请求方法判断
    const method = context.method?.toUpperCase()
    const idempotentMethods = ['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE']
    
    return idempotentMethods.includes(method)
  }
  
  // 计算延迟时间
  calculateDelay(attempt) {
    // 指数退避
    let delay = this.baseDelay * Math.pow(this.backoffFactor, attempt)
    
    // 添加抖动
    if (this.jitter) {
      delay = delay * (0.5 + Math.random() * 0.5)
    }
    
    // 限制最大延迟
    return Math.min(delay, this.maxDelay)
  }
  
  // 延迟函数
  delay(ms) {
    return new Promise(resolve => setTimeout(resolve, ms))
  }
}

// 创建不同场景的重试策略
export const defaultRetry = new RetryStrategy({
  maxRetries: 3,
  baseDelay: 1000,
  maxDelay: 10000
})

export const quickRetry = new RetryStrategy({
  maxRetries: 2,
  baseDelay: 500,
  maxDelay: 2000
})

export const persistentRetry = new RetryStrategy({
  maxRetries: 5,
  baseDelay: 2000,
  maxDelay: 30000
})

export default RetryStrategy

重试装饰器

javascript
// 🎉 重试装饰器
// utils/retryDecorator.js
import { defaultRetry } from './retryStrategy'

// 重试装饰器函数
export function withRetry(retryStrategy = defaultRetry) {
  return function(target, propertyKey, descriptor) {
    const originalMethod = descriptor.value
    
    descriptor.value = async function(...args) {
      return retryStrategy.execute(
        () => originalMethod.apply(this, args),
        {
          method: this.method || 'GET',
          url: this.url
        }
      )
    }
    
    return descriptor
  }
}

// 使用示例
class ApiService {
  @withRetry(quickRetry)
  async getUserInfo(userId) {
    const response = await axios.get(`/users/${userId}`)
    return response.data
  }
  
  @withRetry(persistentRetry)
  async uploadFile(file) {
    const formData = new FormData()
    formData.append('file', file)
    
    const response = await axios.post('/upload', formData)
    return response.data
  }
}

用户友好的错误反馈

错误提示组件

vue
<!-- 🎉 ErrorBoundary.vue - 错误边界组件 -->
<template>
  <div class="error-boundary">
    <div v-if="hasError" class="error-display">
      <div class="error-icon">
        <svg width="64" height="64" viewBox="0 0 24 24" fill="currentColor">
          <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/>
        </svg>
      </div>
      
      <div class="error-content">
        <h3 class="error-title">{{ errorTitle }}</h3>
        <p class="error-message">{{ errorMessage }}</p>
        
        <div class="error-actions">
          <button
            v-if="showRetry"
            class="retry-button"
            @click="handleRetry"
            :disabled="retrying"
          >
            {{ retrying ? '重试中...' : '重试' }}
          </button>
          
          <button
            v-if="showRefresh"
            class="refresh-button"
            @click="handleRefresh"
          >
            刷新页面
          </button>
          
          <button
            v-if="showGoBack"
            class="back-button"
            @click="handleGoBack"
          >
            返回上页
          </button>
        </div>
        
        <details v-if="showDetails && errorDetails" class="error-details">
          <summary>错误详情</summary>
          <pre>{{ errorDetails }}</pre>
        </details>
      </div>
    </div>
    
    <slot v-else></slot>
  </div>
</template>

<script>
import { ref, computed } from 'vue'

export default {
  name: 'ErrorBoundary',
  
  props: {
    fallback: {
      type: Function,
      default: null
    },
    
    onError: {
      type: Function,
      default: null
    },
    
    showDetails: {
      type: Boolean,
      default: false
    }
  },
  
  setup(props, { emit }) {
    const hasError = ref(false)
    const error = ref(null)
    const retrying = ref(false)
    
    // 计算属性
    const errorTitle = computed(() => {
      if (!error.value) return ''
      
      const errorTitles = {
        'NETWORK_ERROR': '网络连接失败',
        'TIMEOUT_ERROR': '请求超时',
        'SERVER_ERROR': '服务器错误',
        'PERMISSION_ERROR': '权限不足',
        'NOT_FOUND_ERROR': '页面不存在'
      }
      
      return errorTitles[error.value.type] || '出现错误'
    })
    
    const errorMessage = computed(() => {
      if (!error.value) return ''
      
      return error.value.message || '抱歉,出现了一些问题,请稍后重试'
    })
    
    const errorDetails = computed(() => {
      if (!error.value) return ''
      
      return JSON.stringify(error.value, null, 2)
    })
    
    const showRetry = computed(() => {
      return error.value?.retryable !== false
    })
    
    const showRefresh = computed(() => {
      return error.value?.type === 'SERVER_ERROR' || error.value?.status >= 500
    })
    
    const showGoBack = computed(() => {
      return error.value?.type === 'NOT_FOUND_ERROR' || error.value?.status === 404
    })
    
    // 方法
    const captureError = (err) => {
      hasError.value = true
      error.value = err
      
      // 调用错误回调
      if (props.onError) {
        props.onError(err)
      }
      
      // 发送错误事件
      emit('error', err)
    }
    
    const handleRetry = async () => {
      if (!error.value?.retry) return
      
      retrying.value = true
      
      try {
        await error.value.retry()
        
        // 重试成功,清除错误状态
        hasError.value = false
        error.value = null
      } catch (retryError) {
        // 重试失败,更新错误信息
        error.value = retryError
      } finally {
        retrying.value = false
      }
    }
    
    const handleRefresh = () => {
      window.location.reload()
    }
    
    const handleGoBack = () => {
      if (window.history.length > 1) {
        window.history.back()
      } else {
        window.location.href = '/'
      }
    }
    
    const reset = () => {
      hasError.value = false
      error.value = null
      retrying.value = false
    }
    
    return {
      hasError,
      error,
      retrying,
      errorTitle,
      errorMessage,
      errorDetails,
      showRetry,
      showRefresh,
      showGoBack,
      captureError,
      handleRetry,
      handleRefresh,
      handleGoBack,
      reset
    }
  }
}
</script>

<style scoped>
.error-boundary {
  width: 100%;
  height: 100%;
}

.error-display {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-height: 400px;
  padding: 2rem;
  text-align: center;
}

.error-icon {
  color: #ef4444;
  margin-bottom: 1rem;
}

.error-content {
  max-width: 500px;
}

.error-title {
  font-size: 1.5rem;
  font-weight: 600;
  color: #374151;
  margin-bottom: 0.5rem;
}

.error-message {
  color: #6b7280;
  margin-bottom: 2rem;
  line-height: 1.6;
}

.error-actions {
  display: flex;
  gap: 1rem;
  justify-content: center;
  margin-bottom: 2rem;
}

.error-actions button {
  padding: 0.75rem 1.5rem;
  border: none;
  border-radius: 0.375rem;
  font-weight: 500;
  cursor: pointer;
  transition: background-color 0.3s ease;
}

.retry-button {
  background-color: #3b82f6;
  color: white;
}

.retry-button:hover:not(:disabled) {
  background-color: #2563eb;
}

.retry-button:disabled {
  background-color: #9ca3af;
  cursor: not-allowed;
}

.refresh-button {
  background-color: #10b981;
  color: white;
}

.refresh-button:hover {
  background-color: #059669;
}

.back-button {
  background-color: #6b7280;
  color: white;
}

.back-button:hover {
  background-color: #4b5563;
}

.error-details {
  text-align: left;
  margin-top: 1rem;
}

.error-details summary {
  cursor: pointer;
  font-weight: 500;
  margin-bottom: 0.5rem;
}

.error-details pre {
  background-color: #f3f4f6;
  padding: 1rem;
  border-radius: 0.375rem;
  overflow-x: auto;
  font-size: 0.875rem;
}
</style>

📚 HTTP错误处理机制学习总结与下一步规划

✅ 本节核心收获回顾

通过本节HTTP错误处理机制的学习,你已经掌握:

  1. 错误类型识别:理解了不同类型的HTTP错误和处理策略
  2. 错误捕获机制:掌握了全局和局部错误捕获的完整方案
  3. 重试策略设计:实现了智能的请求重试和退避算法
  4. 用户反馈系统:构建了友好的错误提示和用户引导
  5. 错误监控记录:建立了完整的错误日志和监控系统

🎯 错误处理机制下一步

  1. 请求取消机制:学习如何取消不需要的请求
  2. 数据缓存策略:实现API数据的缓存和离线处理
  3. 性能监控:深入学习前端性能监控和优化
  4. 安全防护:学习前端安全防护和攻击防范

🔗 相关学习资源

  • HTTP状态码详解:MDN Web文档
  • 前端错误监控:Sentry、LogRocket等监控平台文档
  • 网络错误处理:相关技术博客和最佳实践
  • 用户体验设计:错误页面和提示的设计指南

💪 实践建议

  1. 错误处理完善:为项目建立完整的错误处理体系
  2. 监控系统部署:部署生产环境的错误监控和告警
  3. 用户体验优化:优化错误提示和恢复流程
  4. 团队规范制定:制定团队的错误处理规范和标准

🔍 常见问题FAQ

Q1: 如何区分网络错误和服务器错误?

A: 网络错误通常没有response对象,服务器错误有response但状态码为5xx。可以通过error.response来判断。

Q2: 什么情况下应该自动重试?

A: 网络错误、超时错误、5xx服务器错误,以及幂等请求(GET、PUT、DELETE)失败时可以自动重试。

Q3: 如何避免重试风暴?

A: 使用指数退避算法、添加随机抖动、限制最大重试次数和最大延迟时间。

Q4: 错误信息如何国际化?

A: 建立错误码映射表,根据当前语言环境返回对应的错误消息。

Q5: 如何处理敏感信息的错误日志?

A: 在发送错误日志前过滤敏感信息,如密码、token等,只记录必要的调试信息。


🛠️ 错误处理最佳实践

错误处理检查清单

javascript
// 🎉 错误处理检查清单
const errorHandlingChecklist = {
  capture: [
    '✅ 全局错误捕获',
    '✅ Promise错误捕获',
    '✅ 组件错误边界',
    '✅ 网络错误处理',
    '✅ 业务错误处理'
  ],
  
  retry: [
    '✅ 智能重试策略',
    '✅ 指数退避算法',
    '✅ 重试次数限制',
    '✅ 幂等性检查',
    '✅ 重试状态管理'
  ],
  
  feedback: [
    '✅ 友好错误提示',
    '✅ 错误恢复指导',
    '✅ 加载状态显示',
    '✅ 离线状态处理',
    '✅ 降级方案提供'
  ]
}

错误监控指标

javascript
// 🎉 关键错误监控指标
const errorMetrics = {
  // 错误率指标
  errorRate: {
    total: '总错误率',
    network: '网络错误率',
    server: '服务器错误率',
    client: '客户端错误率'
  },
  
  // 性能指标
  performance: {
    retryRate: '重试成功率',
    recoveryTime: '错误恢复时间',
    userImpact: '用户影响范围'
  }
}

"完善的错误处理机制是构建健壮应用的基础,良好的错误处理能够显著提升用户体验和系统稳定性。继续学习请求取消机制,了解如何优化请求管理和避免资源浪费!"