177 lines
4.1 KiB
Markdown
177 lines
4.1 KiB
Markdown
|
|
# 错误处理优化说明
|
|||
|
|
|
|||
|
|
## ✅ 已完成
|
|||
|
|
|
|||
|
|
已实现统一的错误处理机制,包括后端错误处理和前端错误提示优化。
|
|||
|
|
|
|||
|
|
## 功能特性
|
|||
|
|
|
|||
|
|
### 1. 后端错误处理
|
|||
|
|
|
|||
|
|
#### 自定义异常类 (`backend/app/core/exceptions.py`)
|
|||
|
|
|
|||
|
|
- `BaseAPIException`: 基础API异常类
|
|||
|
|
- `ValidationError`: 验证错误 (400)
|
|||
|
|
- `NotFoundError`: 资源未找到错误 (404)
|
|||
|
|
- `UnauthorizedError`: 未授权错误 (401)
|
|||
|
|
- `ForbiddenError`: 禁止访问错误 (403)
|
|||
|
|
- `ConflictError`: 资源冲突错误 (409)
|
|||
|
|
- `InternalServerError`: 内部服务器错误 (500)
|
|||
|
|
- `WorkflowExecutionError`: 工作流执行错误 (500)
|
|||
|
|
|
|||
|
|
#### 全局错误处理器 (`backend/app/core/error_handler.py`)
|
|||
|
|
|
|||
|
|
- `validation_exception_handler`: 处理请求验证错误
|
|||
|
|
- `api_exception_handler`: 处理自定义API异常
|
|||
|
|
- `sqlalchemy_exception_handler`: 处理数据库错误
|
|||
|
|
- `general_exception_handler`: 处理通用异常
|
|||
|
|
|
|||
|
|
#### 统一错误响应格式
|
|||
|
|
|
|||
|
|
所有错误响应都遵循以下格式:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"error": "ERROR_CODE",
|
|||
|
|
"message": "错误描述信息",
|
|||
|
|
"details": [] // 可选,详细错误信息
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 前端错误处理
|
|||
|
|
|
|||
|
|
#### API拦截器优化 (`frontend/src/api/index.ts`)
|
|||
|
|
|
|||
|
|
- **401未授权**: 自动清除token并跳转到登录页
|
|||
|
|
- **403禁止访问**: 显示无权访问提示
|
|||
|
|
- **404未找到**: 显示资源不存在提示
|
|||
|
|
- **422验证错误**: 显示详细的字段验证错误
|
|||
|
|
- **500服务器错误**: 显示服务器错误提示
|
|||
|
|
- **网络错误**: 显示网络连接错误提示
|
|||
|
|
|
|||
|
|
#### 错误提示优化
|
|||
|
|
|
|||
|
|
- 使用Element Plus的`ElMessage`组件显示错误
|
|||
|
|
- 根据错误类型显示不同的错误信息
|
|||
|
|
- 记录错误日志到控制台
|
|||
|
|
|
|||
|
|
### 3. 工作流执行错误处理
|
|||
|
|
|
|||
|
|
#### 详细错误信息
|
|||
|
|
|
|||
|
|
- 节点执行失败时,记录节点ID和节点类型
|
|||
|
|
- 包含详细的错误堆栈信息
|
|||
|
|
- 错误信息包含上下文信息
|
|||
|
|
|
|||
|
|
#### 错误日志
|
|||
|
|
|
|||
|
|
- 使用Python logging模块记录错误
|
|||
|
|
- 记录请求日志(方法、路径、状态码、耗时)
|
|||
|
|
- 记录异常堆栈信息
|
|||
|
|
|
|||
|
|
## 使用示例
|
|||
|
|
|
|||
|
|
### 后端使用自定义异常
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
from app.core.exceptions import NotFoundError, ConflictError, ValidationError
|
|||
|
|
|
|||
|
|
# 资源未找到
|
|||
|
|
if not workflow:
|
|||
|
|
raise NotFoundError("工作流", workflow_id)
|
|||
|
|
|
|||
|
|
# 资源冲突
|
|||
|
|
if user_exists:
|
|||
|
|
raise ConflictError("用户名已存在")
|
|||
|
|
|
|||
|
|
# 验证错误
|
|||
|
|
if not valid_data:
|
|||
|
|
raise ValidationError("数据验证失败")
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 前端错误处理
|
|||
|
|
|
|||
|
|
前端会自动处理所有HTTP错误,并显示相应的提示信息:
|
|||
|
|
|
|||
|
|
```typescript
|
|||
|
|
// 自动处理,无需手动处理
|
|||
|
|
try {
|
|||
|
|
await api.post('/api/v1/workflows', workflowData)
|
|||
|
|
} catch (error) {
|
|||
|
|
// 错误已在拦截器中处理,这里可以添加额外逻辑
|
|||
|
|
console.error('保存失败:', error)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 错误响应示例
|
|||
|
|
|
|||
|
|
### 验证错误 (422)
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"error": "VALIDATION_ERROR",
|
|||
|
|
"message": "请求参数验证失败",
|
|||
|
|
"details": [
|
|||
|
|
{
|
|||
|
|
"field": "name",
|
|||
|
|
"message": "字段不能为空",
|
|||
|
|
"type": "value_error.missing"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 资源未找到 (404)
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"error": "NOT_FOUND",
|
|||
|
|
"message": "工作流不存在: abc123"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 工作流执行错误 (500)
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"error": "WORKFLOW_EXECUTION_ERROR",
|
|||
|
|
"message": "节点 node-1 执行失败: LLM调用失败"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 日志记录
|
|||
|
|
|
|||
|
|
### 请求日志
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
2024-01-17 00:25:49 - INFO - POST /api/v1/workflows - 客户端: 192.168.1.1
|
|||
|
|
2024-01-17 00:25:49 - INFO - POST /api/v1/workflows - 状态码: 201 - 耗时: 0.123s
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 错误日志
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
2024-01-17 00:25:49 - ERROR - API异常: 工作流不存在 (错误码: NOT_FOUND)
|
|||
|
|
2024-01-17 00:25:49 - ERROR - 节点执行失败: node-1 (llm) - LLM调用失败
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 优势
|
|||
|
|
|
|||
|
|
1. **统一格式**: 所有错误响应遵循统一格式
|
|||
|
|
2. **详细日志**: 记录完整的错误信息和堆栈
|
|||
|
|
3. **用户友好**: 前端自动显示友好的错误提示
|
|||
|
|
4. **易于调试**: 错误信息包含上下文信息
|
|||
|
|
5. **类型安全**: 使用自定义异常类,类型明确
|
|||
|
|
|
|||
|
|
## 后续计划
|
|||
|
|
|
|||
|
|
- [ ] 添加错误监控和告警
|
|||
|
|
- [ ] 实现错误重试机制
|
|||
|
|
- [ ] 添加错误统计和分析
|
|||
|
|
- [ ] 实现错误恢复机制
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
**状态**: ✅ 已完成
|
|||
|
|
**时间**: 2024年
|