API 錯誤處理規範
📋 概述
Drama Ling API 的統一錯誤處理機制、錯誤碼定義和錯誤回應格式。
🔧 標準錯誤格式
錯誤回應結構
{
"success": false,
"data": null,
"message": "操作失敗的簡短描述",
"error": {
"code": "SPECIFIC_ERROR_CODE",
"message": "詳細的錯誤描述",
"details": {
"field": "field_name",
"reason": "具體錯誤原因",
"suggestion": "建議的解決方案"
}
},
"meta": {
"timestamp": "2024-09-07T12:00:00Z",
"request_id": "req_550e8400-e29b-41d4-a716-446655440000",
"api_version": "v1"
}
}
📚 錯誤碼分類
🔐 認證相關錯誤 (1xxx)
| 錯誤碼 |
HTTP狀態 |
描述 |
建議處理 |
INVALID_CREDENTIALS |
401 |
登入憑證錯誤 |
要求用戶重新輸入憑證 |
TOKEN_EXPIRED |
401 |
Token已過期 |
自動刷新Token或要求重新登入 |
TOKEN_INVALID |
401 |
Token無效或格式錯誤 |
清除本地Token並要求重新登入 |
TOKEN_BLACKLISTED |
401 |
Token已被列入黑名單 |
強制用戶重新登入 |
ACCOUNT_LOCKED |
423 |
帳號因多次失敗嘗試被鎖定 |
顯示鎖定時間並提供密碼重設 |
EMAIL_EXISTS |
409 |
電子郵件已被註冊 |
建議用戶登入或使用其他Email |
USERNAME_EXISTS |
409 |
使用者名稱已存在 |
建議其他可用的使用者名稱 |
VALIDATION_ERROR |
400 |
輸入資料驗證失敗 |
顯示具體的驗證錯誤訊息 |
SOCIAL_LOGIN_ERROR |
400 |
第三方登入驗證失敗 |
要求用戶重試或使用其他登入方式 |
👤 用戶管理相關錯誤 (2xxx)
| 錯誤碼 |
HTTP狀態 |
描述 |
建議處理 |
USER_NOT_FOUND |
404 |
用戶不存在 |
檢查用戶ID或要求重新登入 |
PROFILE_UPDATE_FAILED |
400 |
個人資料更新失敗 |
檢查輸入資料格式 |
AVATAR_UPLOAD_FAILED |
400 |
頭像上傳失敗 |
檢查檔案格式和大小 |
INVALID_PREFERENCES |
400 |
偏好設定無效 |
檢查設定值範圍 |
USERNAME_TAKEN |
409 |
用戶名已被使用 |
建議其他可用用戶名 |
AVATAR_TOO_LARGE |
413 |
頭像檔案過大 |
要求用戶壓縮圖片 |
ACCOUNT_DELETION_FAILED |
400 |
帳號刪除失敗 |
檢查密碼或聯繫客服 |
💳 訂閱相關錯誤 (3xxx)
| 錯誤碼 |
HTTP狀態 |
描述 |
建議處理 |
SUBSCRIPTION_NOT_FOUND |
404 |
訂閱記錄不存在 |
檢查訂閱狀態 |
SUBSCRIPTION_EXPIRED |
403 |
訂閱已過期 |
引導用戶續訂 |
SUBSCRIPTION_CANCELLED |
403 |
訂閱已取消 |
提供重新訂閱選項 |
PAYMENT_VERIFICATION_FAILED |
400 |
付款驗證失敗 |
要求用戶重新購買 |
RECEIPT_INVALID |
400 |
收據無效 |
檢查收據格式或重新購買 |
SUBSCRIPTION_ALREADY_ACTIVE |
409 |
訂閱已啟用 |
提示用戶當前訂閱狀態 |
REFUND_REQUEST_FAILED |
400 |
退款請求失敗 |
聯繫客服處理 |
💬 對話練習相關錯誤 (4xxx)
| 錯誤碼 |
HTTP狀態 |
描述 |
建議處理 |
DIALOGUE_NOT_FOUND |
404 |
對話記錄不存在 |
檢查對話ID |
SCENARIO_NOT_FOUND |
404 |
場景不存在 |
檢查場景ID或刷新場景列表 |
DIALOGUE_ALREADY_COMPLETED |
409 |
對話已完成 |
開始新的對話 |
INSUFFICIENT_LIFE_POINTS |
403 |
命條不足 |
引導用戶購買或等待恢復 |
AI_SERVICE_UNAVAILABLE |
503 |
AI服務暫時無法使用 |
稍後重試 |
RESPONSE_GENERATION_FAILED |
500 |
回應生成失敗 |
重新發送訊息 |
DIALOGUE_TIMEOUT |
408 |
對話逾時 |
重新開始對話 |
🎮 遊戲化系統相關錯誤 (5xxx)
| 錯誤碼 |
HTTP狀態 |
描述 |
建議處理 |
LIFE_POINTS_INSUFFICIENT |
403 |
命條不足 |
引導購買或等待恢復 |
PURCHASE_FAILED |
400 |
道具購買失敗 |
檢查餘額或重試 |
REWARD_ALREADY_CLAIMED |
409 |
獎勵已領取 |
提示用戶已領取 |
ACHIEVEMENT_UNLOCK_FAILED |
500 |
成就解鎖失敗 |
稍後重試 |
LEADERBOARD_UPDATE_FAILED |
500 |
排行榜更新失敗 |
稍後重試 |
TIME_CHALLENGE_EXPIRED |
410 |
時光挑戰已過期 |
開始新的挑戰 |
📚 詞彙學習相關錯誤 (6xxx)
| 錯誤碼 |
HTTP狀態 |
描述 |
建議處理 |
VOCABULARY_NOT_FOUND |
404 |
詞彙不存在 |
檢查詞彙ID |
REVIEW_SESSION_EXPIRED |
410 |
複習階段已過期 |
開始新的複習 |
SPACED_REPETITION_ERROR |
500 |
間隔複習計算錯誤 |
稍後重試 |
VOCABULARY_PROGRESS_SYNC_FAILED |
500 |
詞彙進度同步失敗 |
稍後重試 |
MASTERY_UPDATE_FAILED |
500 |
熟練度更新失敗 |
稍後重試 |
🏆 特殊任務相關錯誤 (7xxx)
| 錯誤碼 |
HTTP狀態 |
描述 |
建議處理 |
MISSION_NOT_FOUND |
404 |
任務不存在 |
檢查任務ID |
MISSION_NOT_AVAILABLE |
403 |
任務不可用 |
檢查任務條件 |
MISSION_ALREADY_COMPLETED |
409 |
任務已完成 |
等待明日任務重置 |
MISSION_PROGRESS_UPDATE_FAILED |
500 |
任務進度更新失敗 |
稍後重試 |
REWARD_CLAIM_FAILED |
500 |
獎勵領取失敗 |
稍後重試 |
DAILY_RESET_FAILED |
500 |
每日重置失敗 |
聯繫客服 |
📈 語言程度相關錯誤 (8xxx)
| 錯誤碼 |
HTTP狀態 |
描述 |
建議處理 |
LEVEL_ASSESSMENT_FAILED |
500 |
程度評估失敗 |
稍後重試 |
ADVANCEMENT_CONDITIONS_NOT_MET |
403 |
晉階條件未滿足 |
顯示所需條件 |
LEVEL_UPDATE_FAILED |
500 |
程度更新失敗 |
稍後重試 |
PERFECT_DIALOGUE_VALIDATION_FAILED |
400 |
滿星對話驗證失敗 |
重新檢查對話結果 |
🔄 回覆輔助相關錯誤 (9xxx)
| 錯誤碼 |
HTTP狀態 |
描述 |
建議處理 |
HINT_LIMIT_EXCEEDED |
429 |
提示使用次數超限 |
等待重置或購買更多 |
TRANSLATION_SERVICE_UNAVAILABLE |
503 |
翻譯服務暫時無法使用 |
稍後重試 |
SUGGESTION_GENERATION_FAILED |
500 |
建議生成失敗 |
稍後重試 |
CONTEXT_ANALYSIS_FAILED |
500 |
語境分析失敗 |
稍後重試 |
⚙️ 系統相關錯誤 (9xxx)
| 錯誤碼 |
HTTP狀態 |
描述 |
建議處理 |
INTERNAL_SERVER_ERROR |
500 |
內部伺服器錯誤 |
稍後重試或聯繫客服 |
SERVICE_UNAVAILABLE |
503 |
服務暫時無法使用 |
稍後重試 |
RATE_LIMIT_EXCEEDED |
429 |
請求頻率超限 |
降低請求頻率 |
MAINTENANCE_MODE |
503 |
系統維護中 |
等待維護完成 |
DATABASE_CONNECTION_FAILED |
500 |
資料庫連線失敗 |
稍後重試 |
EXTERNAL_API_ERROR |
502 |
外部API錯誤 |
稍後重試 |
📱 錯誤回應範例
驗證錯誤
{
"success": false,
"data": null,
"message": "輸入資料驗證失敗",
"error": {
"code": "VALIDATION_ERROR",
"message": "註冊資料格式不正確",
"details": {
"email": ["Email格式無效"],
"password": ["密碼至少需要8位字元"],
"username": ["用戶名只能包含字母和數字"]
}
},
"meta": {
"timestamp": "2024-09-07T12:00:00Z",
"request_id": "req_12345"
}
}
權限錯誤
{
"success": false,
"data": null,
"message": "無權限存取此功能",
"error": {
"code": "SUBSCRIPTION_REQUIRED",
"message": "此功能需要訂閱會員",
"details": {
"required_subscription": "premium",
"current_status": "free_user",
"upgrade_url": "/subscription/plans"
}
},
"meta": {
"timestamp": "2024-09-07T12:00:00Z",
"request_id": "req_12345"
}
}
資源不存在錯誤
{
"success": false,
"data": null,
"message": "請求的資源不存在",
"error": {
"code": "DIALOGUE_NOT_FOUND",
"message": "指定的對話記錄不存在",
"details": {
"dialogue_id": "DLG_12345",
"possible_reasons": [
"對話ID錯誤",
"對話已被刪除",
"無權限存取此對話"
]
}
},
"meta": {
"timestamp": "2024-09-07T12:00:00Z",
"request_id": "req_12345"
}
}
服務無法使用錯誤
{
"success": false,
"data": null,
"message": "服務暫時無法使用",
"error": {
"code": "AI_SERVICE_UNAVAILABLE",
"message": "AI對話服務暫時無法使用",
"details": {
"service": "openai_gpt",
"estimated_recovery": "2024-09-07T12:30:00Z",
"alternative_actions": [
"稍後重試",
"使用離線功能"
]
}
},
"meta": {
"timestamp": "2024-09-07T12:00:00Z",
"request_id": "req_12345"
}
}
🔧 錯誤處理最佳實踐
客戶端錯誤處理
// 錯誤處理範例
async function handleApiCall(apiFunction) {
try {
const response = await apiFunction();
return response.data;
} catch (error) {
const errorCode = error.response?.data?.error?.code;
switch (errorCode) {
case 'TOKEN_EXPIRED':
// 自動刷新Token
await refreshAuthToken();
return await apiFunction();
case 'SUBSCRIPTION_REQUIRED':
// 引導用戶升級
showSubscriptionModal();
break;
case 'RATE_LIMIT_EXCEEDED':
// 等待後重試
await delay(5000);
return await apiFunction();
default:
// 顯示通用錯誤訊息
showErrorMessage(error.response?.data?.error?.message);
}
}
}
伺服器錯誤記錄
// 伺服器端錯誤記錄
function logError(error, request) {
const errorLog = {
timestamp: new Date().toISOString(),
request_id: request.headers['x-request-id'],
user_id: request.user?.id,
endpoint: request.path,
method: request.method,
error_code: error.code,
error_message: error.message,
stack_trace: error.stack,
user_agent: request.headers['user-agent']
};
logger.error('API Error', errorLog);
}
📊 錯誤監控與分析
錯誤指標
- 4xx錯誤率: 客戶端錯誤百分比
- 5xx錯誤率: 伺服器錯誤百分比
- 回應時間: 錯誤回應的速度
- 錯誤趨勢: 錯誤數量隨時間變化
告警規則
- 5xx錯誤率 > 1%
- Token相關錯誤激增
- 外部服務錯誤頻繁
- 特定端點錯誤率異常
負責人: 後端開發團隊
最後更新: 2024年9月7日
相關文檔: 共通規範, 認證API