从catch块调用@afterThrowing建议来打印抛出的异常

时间:2014-02-26 13:48:11

标签: java spring exception log4j spring-aop

我们正在使用Spring AOP和Log4j来登录我们的应用程序。我在应用程序中实现了@ Before,@ After,@ AfterThrowing建议。但我面临以下问题:

当在catch块中捕获到任何异常时,它不会调用@AfterThrowing建议来打印错误堆栈跟踪。

public void create() throws Exception
{
    try
    {
        throw new NullPointerException();
    }
    catch(NullPointerException ex)
    {
        // want to call any advice for printing ex.printStackTrace();           
    }

}

我想为catch块中捕获的异常打印“错误堆栈跟踪”。意味着当try块中发生任何异常并被catch捕获时,应该调用一些建议来打印错误详细信息。

提前致谢!!!

3 个答案:

答案 0 :(得分:1)

Spring AOP只能拦截方法执行,所以如果你在方法中捕获异常,它就不会到达拦截器。您可以建议在AspectJ中抛出异常,我相信(使用handler()切入点指示符)。

答案 1 :(得分:0)

这是不可能的。 Spring AOP仅适用于方法调用级别。换句话说,建议的连接点是方法调用。

顾名思义,@AfterThrowing可以在方法抛出后执行。在您的情况下,该方法不会从建议的角度抛出任何东西,即。该方法不会通过抛出异常来终止。它正常结束,因为捕获并处理了异常。

答案 2 :(得分:0)

我找到了弹簧AOP的解决方案。根据你的消息来源,

public void create() throws Exception
{
    try
    {
        throw new NullPointerException();
    }
    catch(NullPointerException ex)
    {
        // want to call any advice for printing ex.printStackTrace();           
    }

}

不要将try{}catch()放在此方法中。然后您的Aspect建议将触发。并将try catch语句放入方法调用者。像这样。

class Abc{
public void create() throws Exception
{
    throw new NullPointerException();
}
}

然后,

public static void main(String[] args) {
    try{
        abc_obj.abc();
    }catch(NullPointerException ex){
        System.out.println("NUllpointer");
    }
}