程序员如何做「错误处理」:不是崩溃,是优雅
程序出错是必然的。
错误处理做得好,用户感受不到问题;做得不好,用户看到的是崩溃。
一、错误处理的分层
1. 预防
- 输入校验
- 类型检查
- 边界处理
尽量在源头阻止错误。
2. 捕获
- try-catch
- 全局异常处理
捕获后记录日志。
3. 恢复
- 重试
- 回退
- 降级
出错后尽量恢复正常。
二、Java 的异常体系
受检异常(Checked Exception)
必须捕获或声明抛出。
如:IOException、SQLException
非受检异常(Unchecked Exception)
可以不捕获。
如:NullPointerException、IllegalArgumentException
最佳实践
- 业务异常用自定义异常
- 技术异常根据情况处理
- 不要吞掉异常(catch 后什么都不做)
三、错误处理的最佳实践
1. 不要返回 null
返回 null 调用方容易忽略。
- 返回空集合
- 用 Optional
- 用 Null Object 模式
2. 尽早失败
校验前置,不要等到中间才发现。
// 好的写法
validate(user);
save(user);
// 不好的写法
save(user); // 如果user无效,到这里才发现
3. 给明确的错误信息
"系统错误" → "用户不存在,请检查输入"
4. 记录日志
- 异常类型
- 堆栈信息
- 上下文(请求 ID、用户 ID)
四、全局异常处理
Spring Boot
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public Response handle(Exception e) {
log.error("系统异常", e);
return Response.error("系统异常");
}
}
前端
- 显示友好错误信息
- 不暴露技术细节
- 记录错误日志
五、一句话总结
错误处理 = 预防 + 捕获 + 恢复 + 明确信息 + 记录日志。