我正在编写一个独立的应用程序,它必须启动并长时间无人值守。它不需要让异常停止,而是需要记录具有足够信息的异常,以便支持人员知道发生了什么,然后继续。
因此,每个异常都包含在运行时异常中,然后抛出以由应用程序的其他部分记录。我正在使用aop:config标签来创建一个方面来记录应用程序其余部分抛出的运行时异常。然后异常将调用堆栈继续到UncaughtExceptionHandler以静默结束异常。 但是,重复捕获相同的异常并记录(每个异常由单独的线程写入,并转到单独的日志文件中)。在调试器中,两个异常都具有相同的ID。
我的applicationContext是基本的:
<aop:config> <aop:aspect ref="exceptionLoggingAspect"> <aop:after-throwing method="logException" pointcut="execution(* *.*(..))" throwing="exception" /> </aop:aspect> </aop:config>
UncaughtExceptionHandler同样基本,至少在我开始工作之前:
private void setUncaughtExceptionHandler()
{
final Handler handler = new Handler();
Thread.setDefaultUncaughtExceptionHandler(handler);
}
class Handler implements Thread.UncaughtExceptionHandler
{
@Override
public void uncaughtException(Thread t, Throwable e)
{
System.out.println("Throwable: " + e.getMessage());
System.out.println(t.toString());
}
}
我已经通过将切入点限制为单个包并从该包中抛出异常(不是异常日志记录所在的包)进行了实验,但它仍然记录了两次。 这个想法有根本错吗?建议表示赞赏。
答案 0 :(得分:0)
在考虑了这个之后,决定不需要Aspect,并且只是混淆了这个问题。我将日志记录添加到UncaughtExceptionHandler,它现在记录单个异常。我仍然不知道为什么同一个异常被记录多次。