- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的应用程序中使用 log4j,只是想知道我是否将 Exception
对象传递到记录器中,如 (1) 中所示,这是否会比我传递时消耗更多资源在e.fillInStackTrace()
中,如(2)所示?换句话说,(2)会比(1)更便宜吗?下面是我在 log4j 上的示例代码。
private static Logger logger = Logger.getLogger(...);
try {
...
}
catch( Exception e ) {
logger.error("blah blah blah", e); // (1)
logger.error("blah blah blah", e.fillInStackTrace()); // (2)
}
我有点困惑,请帮忙澄清一下?
最佳答案
好吧,如果您查看 fillInStackTrace
,您会注意到该方法是同步的
。在 Java(或任何语言)中,同步被认为是一个相当昂贵的操作,因为它需要获取和释放监视器。
此外,您应该注意,从 fillInStackTrace
返回的 Throwable
仅记录有关 fillInStackTrace
当时调用堆栈的堆栈帧的信息叫做。该信息直接从 JVM 收集,然后转换为对象表示,这又会消耗资源。 (最终,fillInStackTrace
委托(delegate)给一个 native
方法,该方法扫描调用线程的当前调用堆栈。)
但是,您应该主要考虑要在日志中显示的内容,并根据该标准做出决定。当您显式调用 fillInStackTrace
时,当前 调用堆栈将出现在您的日志中。这意味着您将不会再看到进入 try
block 的更深调用堆栈(考虑您的示例)。
毕竟,您应该始终使用变体(1),除非您明确需要通过(2)获得的信息。我无法自发地想到标准日志记录范围内的解决方案(2)有意义的示例。然而,当您编写某种框架并且想要清除一些与堆栈无关的顶部堆栈条目时,您可以使用(2)来消除堆栈跟踪中的噪音。异常:例如,您可能正在使用某种 ExceptionFactory 来为您创建抛出的异常。那么您不希望堆栈跟踪显示这些工厂方法的堆栈帧,因为它们与错误无关,并且会使尝试调试的用户感到困惑。因此,您可以在收到来自工厂的异常后通过调用 fillInStackTrace
手动填充堆栈跟踪。
查看此示例,直观地了解这两个调用的差异:
class Example {
public static void main(String[] args) {
try {
outerFunction();
}
catch (Throwable e) {
System.err.println("Outside:");
e.printStackTrace();
}
}
static void outerFunction() throws Throwable {
try {
innerFunction();
}
catch(Exception e) {
System.err.println("Inside:");
e.printStackTrace();
throw e.fillInStackTrace();
}
}
static void innerFunction() {
throw new RuntimeException("A custom exception");
}
}
将调用这两个不同的堆栈跟踪:
Inside:
java.lang.RuntimeException: A custom exception
at Example.innerFunction(Example.java:21)
at Example.outerFunction(Example.java:13)
at Example.main(Example.java:19)
Outside:
java.lang.RuntimeException: A custom exception
at Example.outerFunction(Example.java:13)
at Example.main(Example.java:19)
关于java - 在 log4j 中使用 fillInStackTrace() 会更便宜吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18329588/
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
很难说出这里问的是什么。这个问题是模棱两可的、含糊的、不完整的、过于宽泛或修辞的,不能以其目前的形式得到合理的回答。如需帮助澄清此问题以便可以重新打开,visit the help center .
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
我是一名优秀的程序员,十分优秀!