java - 如何在 Java 中记录异常?

标签 java exception logging methods stack-trace

在 Java 中记录异常时,我遇到过几次常见问题。似乎有各种不同的类型需要处理。例如。有些包装了其他异常,有些根本没有消息 - 只有一个类型。

我见过的大多数代码都使用 getMessage() 记录异常。或 toString() .但这些方法并不总能捕获查明问题所需的所有信息 - 其他方法,例如 getCause()getStackTrace()有时会提供额外的信息。

例如,我现在在 Eclipse Inspect 窗口中查看的异常是 InvocationTargetException .异常本身没有原因,没有消息,没有堆栈跟踪......但是 getCause() 的目标是 InvalidUseOfMatchersException ,并填充了这些详细信息。

所以我的问题是:给定一个 any 类型的异常(exception)作为输入,请提供一个方法,该方法将输出一个格式良好的字符串,其中包含 all 关于异常(例如,可能递归调用 getCause() 等等?)在发布之前,我几乎要自己尝试一下,但真的不想重新发明轮子 - 肯定是这样的之前一定已经做过很多次了...?

最佳答案

java.util.logging packageJava SE 中是标准的.其Logger包括一个接受 Throwable 的重载日志方法。对象。 它将为您记录异常的堆栈跟踪及其原因。

例如:

import java.util.logging.Level;
import java.util.logging.Logger;

[...]

Logger logger = Logger.getAnonymousLogger();
Exception e1 = new Exception();
Exception e2 = new Exception(e1);
logger.log(Level.SEVERE, "an exception was thrown", e2);

将记录:

SEVERE: an exception was thrown
java.lang.Exception: java.lang.Exception
    at LogStacktrace.main(LogStacktrace.java:21)
Caused by: java.lang.Exception
    at LogStacktrace.main(LogStacktrace.java:20)

顺便说一句,在内部,这完全符合@philipp-wendler 的建议。 见 source code for SimpleFormatter.java .这只是一个更高级别的接口(interface)。

关于java - 如何在 Java 中记录异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14606293/

相关文章:

java - 导入javax.comm*;错误

java - 日验证返回错误

javascript - Meteor:如何避免检查变量或属性是否存在?

java.lang.reflect.inaccessibleobjectexception 无法使 jdk.internal.loader.classloaders

linux - 如何在每次迭代中以批处理模式从 Linux Top 获取输出?

java - 无法在jsp页面中获取正确的注释名称

java - 向传入的广播添加标志

exception - 从 azure blob 下载时,我得到 "Unable to read data from the transport connection: The connection was closed."

logging - 如何关闭 log4j2 中的 Dozer 日志条目?

java - log4j:WARN org.apache.log4j.ConsoleAppender 中没有这样的属性 [append]