java异常信息写入日志_在日志中记录Java异常信息的正确姿式

  • Post author:
  • Post category:java


遇到的问题

今天遇到一个线上的BUG,在执行表单提交时失败,可是从程序日志中看不到任何异常信息。

在Review源代码时发现,当catch到异常时只是输出了e.getMessage(),以下所示:java

logger.error(“error: {}, {}”, params, e.getMessage());

在日志中看不到任何信息,说明e.getMessage()返回值为空字符串。web

缘由分析

先来看一下Java中的异常类图:

01ac56ca9c9b170b2deef3933708b3c9.png
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



版权声明:本文为weixin_36244678原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。