遇到的问题
今天遇到一个线上的BUG,在执行表单提交时失败,可是从程序日志中看不到任何异常信息。
在Review源代码时发现,当catch到异常时只是输出了e.getMessage(),以下所示:java
logger.error(“error: {}, {}”, params, e.getMessage());
在日志中看不到任何信息,说明e.getMessage()返回值为空字符串。web
缘由分析
先来看一下Java中的异常类图:
spring
Throwable是Java中全部异常信息的顶级父类,其中的成员变量detailMessage就是在调用e.getMessage()返回的值。
那么这个属性会在何时赋值呢,追溯源码发现,该属性只会在Throwable构造函数中赋值。api
public Throwable() {
// 在默认构造函数中不会给detailMessage属性赋值
fillInStackTrace();
}
public Throwable(String message) {
fillInStackTrace();
// 直接将参数赋值给detailMessage
detailMessage = message;
}
public Throwable(String message, Throwable cause) {
fillInStackTrace();
// 直接将参数赋值给detailMessage
detailMessage = message;
this.cause = cause;
}
public Throwable(Throwable cause) {
fillInStackTrace();
// 当传入的Throwable对象不为空时,为detailMes