当前位置: 首页 > 面试题库 >

春季AOP投掷后与建议周围

许马鲁
2023-03-14
问题内容

尝试实现负责捕获和记录某种类型错误的Aspect时,我最初认为可以使用AfterThrowing建议来实现。但是,他的建议似乎并没有捕获到异常,而只是提供了一个额外的切入点来对异常进行处理。

然后,唯一也可以捕获有关异常的建议就是AroundAdvice-要么是我做错了事,要么是我做错了事。

有人可以断言,如果我想捕获异常,必须使用AroundAdvice吗?我使用的配置如下:

@Pointcut("execution(* test.simple.OtherService.print*(..))")
public void printOperation() {}

@AfterThrowing(pointcut="printOperation()", throwing="exception")
public void logException(Throwable exception) {
  System.out.println(exception.getMessage());
}

@Around("printOperation()")
public void swallowException(ProceedingJoinPoint pjp) throws Throwable {
  try {
    pjp.proceed();
  } catch (Throwable exception) {
    System.out.println(exception.getMessage());
  }
}

请注意,在此示例中,我捕获了所有异常,因为这只是一个示例。我知道吞没所有异常是一种不好的做法,但是对于我当前的用例,我希望只记录一种特殊类型的异常,同时避免重复的记录逻辑。


问题答案:

在Spring参考医生说:

“在抛出建议后,当匹配的方法执行因抛出异常而退出时运行”

到那时,捕获异常已经为时已晚,因为该异常已经引发并且该方法已退出。@Around建议所采用的方法是实际捕获异常并在方法退出之前对其进行处理的唯一方法。



 类似资料:
  • 有人可以解释我什么时候使用关键字 throw new 有用.而不是在方法的签名旁边使用抛出? 我知道当方法抛出Checked Exception时。Java迫使我们通过将Exception处理到try-catch块中,或者通过在签名旁边的关键字throws指定将在其他地方完成,从而直接在方法中处理它。 然而,我很难理解何时使用关键字throw new是有用的,以及为什么。它与处理未选中的异常有关吗

  • 问题内容: 我有一个Java应用程序,它从主类开始(不是Spring Boot应用程序)。而且我想使用Spring retry在连接丢失时重试。据我所知,我需要在Spring应用程序的主类之上添加@EnableRetry批注,然后在我的方法之上使用@Retryable进行重试。但是我认为这在非​​Spring应用程序中将不起作用。是否可以在简单的Java应用程序(而非spring应用程序)中使用s

  • 问题内容: 使用Spring 3,我想使用 ExceptionHandler 注释创建一个异常处理程序,该 异常 处理程序将处理 “找不到页面(404)” 请求。我正在使用以下代码来执行此操作。但是,当我指向一个不存在的URL时,将调用Spring定义的默认异常处理程序。 可能是我正在处理 NoSuchRequestHandlingMethodException 异常。如果是,那我应该注册什么例外

  • 问题内容: 我如何让Spring从中加载Hibernate的属性? 我们正在使用Spring和JPA(以Hibernate作为实现)。Spring 指定了JPA语言和Hibernate属性: 在这种配置中,Spring通过applicationContext.xml读取所有的Hibernate属性。当我创建一个(位于我的类路径的根目录,与META- INF处于同一级别)时,Hibernate根本不

  • 问题内容: 有人可以用简单的术语解释ProxyFactoryBean吗? 我看到很多地方都引用了它。 问题答案: 用于将拦截器逻辑应用于现有目标Bean,以便在调用该Bean上的方法时,拦截器在该方法调用之前和之后执行。这是面向方面的编程(AOP)的示例。 最好用一个简单的例子来解释。AOP的经典用例是将缓存应用于方法调用的结果。可以使用以下方式进行连接: 我们有一个类型为bean 的类型,它实现

  • 问题内容: 总的来说,我对Web上的Spring和Java还是很陌生,但是周末我一直在为此苦苦挣扎。将所有配置整合在一起并使Spring在IntelliJ上与gradle一起使用是一个挑战。 我正在尝试在Spring中实施另一个项目,以便更好地了解如何使用它。 我整个上午都在收到此错误,并且在Spring上浏览了许多参考资料和指南,但看不到问题出在哪里。 由以下原因引起:org.springfra