java - Slf4j with Log4j 在wrapper exception有消息时不打印wrapped exception (caused by)

标签 java exception logging log4j slf4j

第一个例子:

public class Main {

    private static final Logger logger = LoggerFactory.getLogger(Main.class);

    public static void main(String[] args) throws Exception {
        try {
            throw new RuntimeException(new NullPointerException("NPE"));
        } catch (RuntimeException e) {
            logger.error("Error:", e);
        }
    }
}

输出:

Error:
java.lang.RuntimeException: java.lang.NullPointerException: NPE
    at Main.main(Main.java:10)

在第二个示例中,我们还向 RuntimeException 添加了一条消息:

throw new RuntimeException("RTE", new NullPointerException("NPE"));

输出:

Error:
java.lang.RuntimeException: RTE
    at Main.main(Main.java:10)

为什么在这种情况下没有记录 NullPointerException

注意:e.printStackTrace() 在两种情况下都打印两个异常:

java.lang.RuntimeException: RTE
    at Main.main(Main.java:10)
Caused by: java.lang.NullPointerException: NPE
    ... 1 more

版本:

slf4j-api: 1.7.12
slf4j-log4j12: 1.7.12
log4j: 1.2.17

最佳答案

尽可能尝试使用所有文档和调试,我希望这能以任何方式提供帮助:

  @param message the message object to log.
  @param t the exception to log, including its stack trace.
  public void error(Object message, Throwable t) 

所以你的两个案例都包括代码语句抛出的 RuntimeException 的堆栈跟踪。差别不大。

案例 1: throw new RuntimeException(new NullPointerException("NPE"));

引自RuntimeException Java-DocNullPointerException Java-Doc

public RuntimeException(Throwable cause)

Constructs a new runtime exception with the specified cause and a detail message of (cause==null ? null : cause.toString()) (which typically contains the class and detail message of cause). This constructor is useful for runtime exceptions that are little more than wrappers for other throwables.


public NullPointerException(String s)

Constructs a NullPointerException with the specified detail message.


所以这可能会回答您问题的第一部分,其中 java.lang.RuntimeException 在执行期间被抛出,这是 new NullPointerException 引起的但作为cause==null cause.toString() 的计算结果为 false打印即 java.lang.NullPointerException 现在因为这个异常本身有一条消息传递如下 NPE

注意:您在代码中提到了 NullPointerException 的原因。(因此 cause==null 的计算结果为 false)

案例 2: throw new RuntimeException("RTE", new NullPointerException("NPE"))

public RuntimeException(String message, Throwable cause)

Constructs a new runtime exception with the specified detail message and cause. Note that the detail message associated with cause is not automatically incorporated in this runtime exception's detail message.


在这种情况下,您最终会得到 java.lang.RuntimeException 被抛出一条消息 RTE 因为你的事业是 RuntimeException 的 child 本身并且父级首先被捕获,它被执行并且在这种情况下未到达子级。

关于java - Slf4j with Log4j 在wrapper exception有消息时不打印wrapped exception (caused by),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36507554/

相关文章:

java : Mutithreading & file reading

java - 为什么 java JDK 无法在我的终端中打印出正确的消息

java - 为什么在 Java 中使用 HashMap 会失败?

Python GeoIP2 地址未找到错误

python - Twisted:禁用 Twisted 框架类的日志记录

asp.net - Log4Net、ThreadContext 和 Global.asax

java - Maven - 在执行过程中故障安全崩溃时生成报告

c++ - RapidXML 节点异常处理

c# - 未捕获未处理的任务异常

json - 无法让 Karaf 4.2.6 使用带有 JsonLayout 的 log4j2 记录布局类型