Java 我们应该为托管异常记录stacktrace吗?
我在这个问题上做了很多研究,但没有找到真正的答案 试着想象一个程序执行一个多线程调用一个可调用函数。 为此,我们启动一个带有特定超时的ExecutorService,该超时调用所有进程 因此,我们有一个try…catch块,包含多个异常:Java 我们应该为托管异常记录stacktrace吗?,java,logging,printstacktrace,Java,Logging,Printstacktrace,我在这个问题上做了很多研究,但没有找到真正的答案 试着想象一个程序执行一个多线程调用一个可调用函数。 为此,我们启动一个带有特定超时的ExecutorService,该超时调用所有进程 因此,我们有一个try…catch块,包含多个异常: 超时的CancellationException 如果在线程中引发异常,则执行异常 突然停止的中断异常 哲学是只记录一条消息,还是记录消息和可丢弃的内容(因此是stacktrace) 总而言之,我们应该这样做: } catch (CancellationE
- 超时的CancellationException
- 如果在线程中引发异常,则执行异常
- 突然停止的中断异常
} catch (CancellationException ce) {
logger.error("Timeout. Process cancelled", ce);
}
还是只记录消息错误
stacktrace是否被视为仅针对Bug显示
谢谢。对于编码,您应该遵循以下模式:
} catch (CancellationException ce) {
logger.error("Timeout. Process cancelled", ce);
}
原因是Throwable捕获了错误的完整上下文。如果您从记录器中省略了该上下文的一部分,那么如果需要,您以后将永远无法访问它。甚至Java附带的Throwable类也随着时间的推移进行了修改,以包含诸如链式和抑制式异常之类的内容。因此,即使您只希望从这个可丢弃的文件中获得消息,您仍然可能希望看到被抑制异常和异常原因的完整堆栈跟踪
在输出端,我认为您可以证明,对于某些异常,堆栈跟踪并不重要。在某些情况下,目标受众不得或不希望看到异常堆栈跟踪。对于这些情况,我们应该利用框架的功能来更改已发布的输出,以满足目标受众的需求。如果需要随时间变化,您可以调整日志记录配置,而无需修复应用程序代码。如果错误未被纠正,例如出现了错误,那么您也需要记录堆栈跟踪。如果您不关心倾向于错误(只想打印消息),那么就不需要stacktrace。您可以使用stacktrace查找错误发生的位置。如果你不在乎在哪里,那就不需要了