当前位置: 首页 > 知识库问答 >
问题:

在打印抛出的异常时从捕获块抛出建议

俞飞鸣
2023-03-14

我们使用带有Log4j的springaop来登录我们的应用程序。我在应用程序中实现了@Before、@After、@posterhrowing建议。但我面临以下问题:

当任何异常在catch块中被捕获时,它不会调用@afterhrowing通知来打印错误堆栈跟踪。

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个答案

越雨泽
2023-03-14

我用spring AOP找到了一个解决方案。根据你的消息来源,

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

}

不要在此方法中放入try{}cat()。然后将触发您的Aspect建议。并且还将try cat语句放到方法调用者中。

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");
    }
}
谢宸
2023-03-14

这是不可能的。SpringAOP仅在方法调用级别工作。换句话说,通知的连接点是方法调用。

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

郎德馨
2023-03-14

Spring AOP只能拦截方法执行,因此如果您捕获了方法中的异常,它将不会到达拦截器。我相信,您可以建议在AbulJ中抛出异常(使用处理程序()切入点指示符)。

 类似资料:
  • 嘿StackOverflow社区, 关于抛出异常。一般什么时候抛出和异常,什么时候抓取? 假设我遇到了这样的情况,我不得不退出,因为发生了一些问题,我无法从它中恢复过来。我是投还是接? 我现在就这么做: 这样做对吗?如果我只是抛出异常会更合适吗?对不起,我是例外的新手:)

  • 我有以下2个代码片段,我想知道是什么使java编译器(在Eclipse与Java7)显示错误的第二个片段,为什么不是第一个。 以下是代码片段: 片段1 片段2 在eclipse中,snippet1显示为finally块添加'SuppressWarning',但在snippet2中,它显示为catch块中的throw语句添加'throws或try catch'块。 我详细研究了以下问题,但没有提供任

  • 问题 你想捕获一个异常后抛出另外一个不同的异常,同时还得在异常回溯中保留两个异常的信息。 解决方案 为了链接异常,使用 raise from 语句来代替简单的 raise 语句。 它会让你同时保留两个异常的信息。例如: >>> def example(): ... try: ... int('N/A') ... except ValueError as e:

  • "CATCH"应该严格地在"扔"之后叫吗?" 例1: 错误: 找不到方法“接收器”:没有方法缓存,也没有^在/tmp/739536251/main块中查找_方法。pl6第11行 例2: 无误

  • 问题 你在一个 except 块中捕获了一个异常,现在想重新抛出它。 解决方案 简单的使用一个单独的 rasie 语句即可,例如: >>> def example(): ... try: ... int('N/A') ... except ValueError: ... print("Didn't work") ...

  • 我有这样的情况,即活动调用管理器类调用提供者。 活动->管理器(带有asyncTask的方法)->提供程序 我应该如何将捕获的异常发送回活动?