【发布时间】:2011-11-30 01:47:32
【问题描述】:
我创建了一个 CustomExceptionClass,它的消息来自配置文件,对用户来说是一条更友好的消息。
然后我想记录抛出的异常,因为如果出现问题,我想知道详细信息,然后我可以解决这个问题。所以,我有一个疑问。
在哪里使用 log4j 记录这些异常?在CustomExceptionClass里面,还是我让抛出这个异常的方法记录下来?
【问题讨论】:
标签: java exception logging log4j
我创建了一个 CustomExceptionClass,它的消息来自配置文件,对用户来说是一条更友好的消息。
然后我想记录抛出的异常,因为如果出现问题,我想知道详细信息,然后我可以解决这个问题。所以,我有一个疑问。
在哪里使用 log4j 记录这些异常?在CustomExceptionClass里面,还是我让抛出这个异常的方法记录下来?
【问题讨论】:
标签: java exception logging log4j
我不确定您是否对 log4j 有特别的疑问,但该 API 只需要调用 log.error(Object,Throwable) 的东西,将消息作为第一个参数传递,将错误作为第二个参数传递。 (log 当然是 Log4J 记录器参考。)
关于在哪里调用log.error 的问题,不要从Throwable 的CustomExceptionClass 子类中调用log.error。相反,我会做出如下决定:
如果您想记录确切发生的事情的详细信息,但不打算将这些详细信息放入 Exception 的子类中,请在引发错误之前记录详细信息。
同样,如果您想记录特定的内容而不管是否或如何捕获异常,那么显然您需要在抛出异常之前执行此操作。您对谁调用非私有方法的控制相对较少。
否则登录 catch 块。这允许您跟踪发生的事情以及您的应用程序如何响应结果。如果您只有第一条信息,那么其他人将不得不阅读代码才能理解“那又怎样?”
最后,对所有线程使用未捕获的异常处理程序被认为是一种很好的做法。有关详细信息,请参阅Thread.UncaughtExceptionHandler。基本上,您确实希望至少记录长时间运行的应用程序中的所有异常。
【讨论】:
您应该将其记录在错误处理代码中,而不是最初创建错误的位置。
【讨论】:
您应该在捕获异常的任何位置进行记录。如果您没有在任何地方捕获它,这实际上取决于您运行应用程序的方式。
【讨论】:
我通常在自定义异常中重载 ToString 和/或 GetMessage,并按照正常情况简单地记录它们。
【讨论】: