在 Java 中记录异常时,我遇到过几次常见问题。似乎有各种不同的类型需要处理。例如。有些包装了其他异常,有些根本没有消息 - 只有一个类型。
我见过的大多数代码都使用 getMessage()
记录异常。或 toString()
.但这些方法并不总能捕获查明问题所需的所有信息 - 其他方法,例如 getCause()
和 getStackTrace()
有时会提供额外的信息。
例如,我现在在 Eclipse Inspect 窗口中查看的异常是 InvocationTargetException
.异常本身没有原因,没有消息,没有堆栈跟踪......但是 getCause() 的目标是 InvalidUseOfMatchersException
,并填充了这些详细信息。
所以我的问题是:给定一个 any 类型的异常(exception)作为输入,请提供一个方法,该方法将输出一个格式良好的字符串,其中包含 all 关于异常(例如,可能递归调用 getCause()
等等?)在发布之前,我几乎要自己尝试一下,但真的不想重新发明轮子 - 肯定是这样的之前一定已经做过很多次了...?
最佳答案
java.util.logging
package在 Java 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/