一、异常处理流程设计目标
1. 保障系统稳定性:确保异常情况下系统能够持续运行或优雅降级
2. 快速定位问题:建立完善的异常捕获和日志记录机制
3. 用户体验保障:在异常发生时提供友好的用户提示和解决方案
4. 数据一致性:防止因异常导致的数据不一致问题
5. 可追溯性:所有异常均有记录可查,便于问题复盘和改进
二、异常分类与处理策略
1. 系统级异常
- 网络异常:超时、断网、DNS解析失败等
- 硬件故障:服务器宕机、存储设备故障
- 第三方服务异常:支付接口、物流API等不可用
处理策略:
- 自动重试机制(带指数退避)
- 熔断器模式(Hystrix或Sentinel)
- 降级服务(返回缓存数据或默认值)
- 实时告警通知运维团队
2. 业务逻辑异常
- 数据验证失败:用户输入不合法
- 库存不足:商品库存为0时下单
- 权限不足:用户尝试访问未授权资源
- 业务规则冲突:如优惠券使用条件不满足
处理策略:
- 前端即时验证反馈
- 明确的错误提示信息
- 事务回滚机制
- 业务日志详细记录
3. 数据异常
- 数据格式错误:JSON解析失败、日期格式错误
- 数据完整性破坏:外键约束违反
- 数据一致性冲突:并发修改导致的数据不一致
处理策略:
- 输入数据严格校验
- 数据库事务管理
- 乐观锁/悲观锁机制
- 数据修复脚本准备
三、异常处理流程实现
1. 异常捕获与日志记录
```java
// 示例:Spring Boot中的全局异常处理
@ControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(Exception.class)
@ResponseBody
public ResponseEntity handleException(Exception ex, HttpServletRequest request) {
// 1. 记录详细日志
logger.error("系统异常 - URL: {}, 异常信息: {}",
request.getRequestURL(), ex.getMessage(), ex);
// 2. 构建错误响应
ErrorResponse errorResponse = new ErrorResponse();
errorResponse.setTimestamp(System.currentTimeMillis());
errorResponse.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
errorResponse.setError("系统内部错误");
errorResponse.setMessage("服务暂时不可用,请稍后再试");
errorResponse.setPath(request.getRequestURI());
// 3. 根据异常类型返回不同响应
if (ex instanceof BusinessException) {
BusinessException be = (BusinessException) ex;
errorResponse.setStatus(be.getErrorCode());
errorResponse.setMessage(be.getMessage());
} else if (ex instanceof HttpClientErrorException) {
errorResponse.setStatus(((HttpClientErrorException) ex).getStatusCode().value());
}
// 4. 发送告警(可根据严重程度决定是否立即告警)
if (ex instanceof CriticalException) {
sendAlert(ex, request);
}
return new ResponseEntity<>(errorResponse, HttpStatus.OK);
}
private void sendAlert(Exception ex, HttpServletRequest request) {
// 实现告警逻辑,如邮件、短信、企业微信等
}
}
```
2. 前端异常处理
```javascript
// Vue.js中的全局异常处理示例
Vue.config.errorHandler = function (err, vm, info) {
// 1. 发送错误到后端日志系统
axios.post(/api/log/error, {
message: err.message,
stack: err.stack,
info: info,
url: window.location.href
});
// 2. 显示用户友好的提示
vm.$notify.error({
title: 系统异常,
message: 操作失败,请稍后再试,
duration: 5000
});
// 3. 记录到控制台(开发环境)
if (process.env.NODE_ENV === development) {
console.error(Vue错误:, err);
}
};
// Axios全局拦截器
axios.interceptors.response.use(
response => response,
error => {
if (error.response) {
// 服务器返回了错误状态码
switch (error.response.status) {
case 401:
// 处理未授权
break;
case 404:
// 处理资源不存在
break;
case 500:
// 处理服务器错误
break;
default:
// 其他错误
}
}
return Promise.reject(error);
}
);
```
3. 数据库事务与异常回滚
```java
@Service
@Transactional(rollbackFor = Exception.class)
public class OrderServiceImpl implements OrderService {
@Autowired
private OrderRepository orderRepository;
@Autowired
private InventoryRepository inventoryRepository;
@Override
public Order createOrder(OrderDTO orderDTO) {
try {
// 1. 扣减库存
inventoryRepository.reduceStock(orderDTO.getProductId(), orderDTO.getQuantity());
// 2. 创建订单
Order order = new Order();
// 设置订单属性...
return orderRepository.save(order);
} catch (Exception e) {
// 事务会自动回滚
throw new BusinessException("创建订单失败", e);
}
}
}
```
四、监控与告警机制
1. 实时监控指标:
- 异常发生率(每分钟/每小时)
- 关键服务响应时间
- 数据库连接池状态
- 第三方服务可用性
2. 告警策略:
- 阈值告警:异常率超过5%触发告警
- 趋势告警:异常率持续上升
- 关键服务不可用立即告警
3. 告警渠道:
- 企业微信/钉钉机器人
- 邮件通知
- SMS短信(针对严重问题)
- 电话告警(P0级故障)
五、异常处理最佳实践
1. 防御性编程:
- 所有外部输入都应视为不可信,进行严格校验
- 使用Optional避免NullPointerException
- 资源使用后确保释放(try-with-resources)
2. 日志规范:
- 统一日志格式(JSON格式便于解析)
- 包含足够上下文信息(用户ID、请求ID、时间戳等)
- 敏感信息脱敏处理
3. 降级与熔断:
- 非核心功能在系统压力大时自动降级
- 使用熔断器防止雪崩效应
- 提供降级后的备用方案
4. 混沌工程:
- 定期进行故障注入测试
- 模拟网络延迟、服务不可用等场景
- 验证异常处理流程的有效性
5. 持续优化:
- 建立异常知识库,记录常见问题及解决方案
- 定期复盘重大异常事件
- 根据业务发展调整异常处理策略
六、快驴生鲜业务特定考虑
1. 生鲜特性处理:
- 库存实时性要求高(避免超卖)
- 冷链物流异常处理(温度监控告警)
- 保质期管理(临近保质期商品特殊处理)
2. 高峰期保障:
- 促销活动前的压力测试
- 限流策略防止系统过载
- 排队机制处理突发流量
3. 合规性要求:
- 食品安全追溯异常处理
- 订单取消的合规流程
- 用户隐私数据保护
通过构建完善的异常处理流程,快驴生鲜系统能够在面对各种异常情况时保持稳定运行,提供可靠的服务,同时为运营团队提供足够的信息来快速定位和解决问题。