通过自定义异常类、@ControllerAdvice全局处理和日志记录实现Java异常统一管理,提升系统可维护性与健壮性,规范异常抛出与响应格式。

在Java开发中,异常的统一管理能提升代码可读性、降低维护成本,并增强系统的健壮性。核心思路是通过自定义异常类、全局异常处理器和日志记录机制,集中处理项目中的各类异常情况。
定义统一的自定义异常类
项目中应避免直接抛出Exception或RuntimeException,而是创建有业务含义的异常类型。
例如,可以定义一个基础的业务异常:
public class BusinessException extends RuntimeException {
private String code;
public BusinessException(String message) {
super(message);
}
public BusinessException(String code, String message) {
super(message);
this.code = code;
}
// getter方法
public String getCode() {
return code;
}
}
根据业务模块,还可进一步细分异常类型,如UserServiceException、OrderNotFoundException等,便于定位问题。
立即学习“Java免费学习笔记(深入)”;
使用@ControllerAdvice进行全局异常处理
Spring Boot项目中,可以通过@ControllerAdvice注解定义全局异常处理器。
创建一个异常处理类:
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(BusinessException.class)
public Map handleBusinessException(BusinessException e) {
Map result = new HashMap<>();
result.put("success", false);
result.put("code", e.getCode() != null ? e.getCode() : "500");
result.put("message", e.getMessage());
return result;
}
@ResponseBody
@ExceptionHandler(NullPointerException.class)
public Map handleNPE(NullPointerException e) {
Map result = new HashMap<>();
result.put("success", false);
result.put("code", "500");
result.put("message", "系统发生了空指针异常,请联系管理员");
return result;
}
@ResponseBody
@ExceptionHandler(Exception.class)
public Map handleOtherException(Exception e) {
Map result = new HashMap<>();
result.put("success", false);
result.put("code", "500");
result.put("message", "系统内部错误");
// 记录日志
log.error("未捕获的异常:", e);
return result;
}
}
这样所有控制器中抛出的异常都会被集中处理,返回格式统一的响应结果。
结合CSS3实现的jQuery分页插件,分页的效果是很常用的,无论是前台还是后端管理系统,都会使用到分页,在企业站或商城网站中都是很实用的。php中文网推荐下载!
结合日志框架记录异常信息
异常发生时,除了向前端返回提示,还应记录详细日志用于排查。
在全局处理器中加入日志输出:
private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
在catch块或@ExceptionHandler方法中调用log.error(),确保堆栈信息写入日志文件。
建议记录的内容包括:异常类型、消息、堆栈、发生时间、请求路径、用户ID(如有)等上下文信息。
规范异常的抛出与捕获
在业务代码中,避免吞掉异常或只打印堆栈而不处理。
- 检查到非法参数时,主动抛出自定义异常
- 调用第三方服务失败,包装为业务异常并保留原始原因
- 不要在controller中写大量try-catch,交给全局处理器
- 异常消息应清晰友好,不暴露敏感信息(如数据库结构)
例如:
if (user == null) {
throw new BusinessException("USER_NOT_FOUND", "用户不存在");
}
基本上就这些。通过统一异常结构、全局拦截和日志追踪,能让Java应用的错误处理更整洁高效。关键是团队遵守约定,不随意抛出原始异常。









