使用@ControllerAdvice和@ExceptionHandler实现Web层全局异常处理,结合自定义异常与日志框架;多线程环境通过Thread.UncaughtExceptionHandler捕获未处理异常,提升系统稳定性与可维护性。

在Java中实现全局异常处理,主要是为了集中管理程序运行过程中未被捕获的异常,避免程序因异常而崩溃,同时提升代码的可维护性和用户体验。通过合理设计,可以统一记录日志、返回友好提示或执行清理操作。
使用Spring Boot中的@ControllerAdvice
如果你使用的是Spring Boot或Spring MVC框架,最常用的方式是结合@ControllerAdvice和@ExceptionHandler注解来实现全局异常处理。
步骤如下:
创建一个类并加上@ControllerAdvice注解,该类将作用于所有控制器。 在类中定义多个@ExceptionHandler方法,分别处理不同类型的异常。 可以返回JSON格式数据(适用于REST API)或跳转到错误页面(传统Web应用)。示例代码:
@ControllerAdvicepublic class GlobalExceptionHandler { @ExceptionHandler(NullPointerException.class) public ResponseEntity handleNullPointer(NullPointerException e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("发生了空指针异常:" + e.getMessage()); } @ExceptionHandler(IllegalArgumentException.class) public ResponseEntity handleIllegalArgument(IllegalArgumentException e) { return ResponseEntity.status(HttpStatus.BAD_REQUEST) .body("参数错误:" + e.getMessage()); } @ExceptionHandler(Exception.class) public ResponseEntity handleGeneralException(Exception e) { return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("服务器内部错误:" + e.getMessage()); }}
处理自定义异常
你可以定义自己的异常类,并在业务逻辑中抛出,然后在全局处理器中捕获并处理。
自定义异常示例:
public class UserNotFoundException extends RuntimeException { public UserNotFoundException(String message) { super(message); }}
在全局异常处理器中添加对应处理方法:
立即学习“Java免费学习笔记(深入)”;
@ExceptionHandler(UserNotFoundException.class)public ResponseEntity<Map> handleUserNotFound(UserNotFoundException e) { Map response = new HashMap(); response.put("error", "用户未找到"); response.put("message", e.getMessage()); return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);}
线程中的全局异常处理
对于非Web环境或多线程场景,Java提供了Thread.UncaughtExceptionHandler来捕获未处理的线程异常。
设置默认异常处理器:
public class MyUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { @Override public void uncaughtException(Thread t, Throwable e) { System.err.println("线程 " + t.getName() + " 发生未捕获异常: " + e.getMessage()); // 可以记录日志或发送告警 }}// 使用方式Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler());
结合日志框架输出异常信息
建议在全局异常处理中集成日志框架(如Logback、Log4j2),便于追踪问题。
例如在异常处理方法中加入日志记录:
@Autowiredprivate Logger logger;@ExceptionHandler(Exception.class)public ResponseEntity handleGeneralException(Exception e) { logger.error("未预期的异常发生:", e); // 记录堆栈信息 return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body("系统繁忙,请稍后重试");}
基本上就这些。根据项目类型选择合适的全局异常处理方式,Web应用优先用@ControllerAdvice,多线程环境注意设置线程异常处理器,再配合日志输出,就能有效掌控系统的异常行为。
以上就是如何在Java中实现全局异常处理的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/12615.html
微信扫一扫
支付宝扫一扫