2011-11-17 41 views
0

我正在编写一个独立的应用程序,它必须启动并长时间无人值守运行。除了有例外情况使其停止之外,它还需要记录具有足够信息的例外情况,以便支持人员了解发生的情况并继续进行。我的异常记录方面记录了两次相同的异常

因此,每个异常都包装在运行时异常中,然后抛出由应用程序的不同部分记录。我使用aop:config标签来创建一个方面来记录应用程序其余部分抛出的运行时异常。然后这个异常将调用堆栈传递给一个UncaughtExceptionHandler以静静地结束这个异常。 但是,相同的异常被重复捕获并记录(每个异常都由单独的线程写入,并转到单独的日志文件中)。在调试器中,两个例外都具有相同的ID。

我的ApplicationContext已基本为这样的:

 
    &ltaop:config> 
     &ltaop:aspect ref="exceptionLoggingAspect"> 
      &ltaop: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

想过这个之后,决定不需要方面,只是混淆了这个问题。我将日志记录添加到UncaughtExceptionHandler,现在它记录单个异常。我仍然不知道为什么相同的异常不止一次被记录。