Micronaut 2.5.8自定义全局异常处理无法映射异常栈与根因问题
问题根因
- 自定义
GlobalException类的构造方法没有正确调用父类RuntimeException的对应构造,导致传入的根异常没有被设置为当前异常的cause,异常消息也没有被传递,这是所有问题的核心原因 - 异常处理逻辑中直接调用
exception.getCause().getCause()没有做非空校验,哪怕根因传递正确,也可能因为异常层级不足触发空指针 - 手动遍历异常栈打印的方式冗余且容易遗漏信息,Java日志框架本身支持直接打印完整异常栈
修复方案
1. 修正GlobalException构造方法
调用父类带Throwable参数的构造,自动完成根因传递、消息赋值的逻辑:
public class GlobalException extends RuntimeException{ // 包装根异常的构造 public GlobalException(Throwable throwable){ super(throwable); } // 可按需扩展支持自定义错误消息的构造 public GlobalException(String message, Throwable throwable){ super(message, throwable); } }
2. 优化异常处理器逻辑
调整日志打印和错误消息取值逻辑,避免空指针问题:
@Override public HttpResponse handle(HttpRequest request, GlobalException exception) { // 直接将异常对象作为日志第二个参数传入,框架会自动打印完整消息、根因、栈信息 LOG.error("请求处理失败", exception); // 多层级兜底取错误消息,避免空指针 String errorMsg = exception.getLocalizedMessage(); if (errorMsg == null && exception.getCause() != null) { errorMsg = exception.getCause().getMessage(); } if (errorMsg == null) { errorMsg = "系统内部错误"; } return HttpResponse.serverError(errorMsg); }
修复后即可正常获取到异常消息和根因信息,不会再触发空指针异常。
内容的提问来源于stack exchange,提问作者San Jaisy
相关产品推荐
相关产品推荐

