2017-08-16 102 views
2

我已经能够找到无数的关于如何在Spring MVC或Spring REST中捕获未处理的异常的教程,但是我想知道的是如何在没有使用Spring Web框架的情况下捕获未处理的异常如何在Spring Boot中捕获非MVC和非REST异常

我正在编写一个没有Web组件的应用程序,而且我不会仅为异常处理导入Spring Web。

当一个@Service引发未处理的异常,我需要抓住它,以便我可以正确地登录到Raygun

例如,考虑在故意抛出未捕获的异常服务这个方法:

@Scheduled(fixedDelay = 100) 
public void doSomething() { 
    throw new RuntimeException("Uh oh!"); 
} 

它的输出将是:

2017-08-16 00:19:40.202 ERROR 91168 --- [pool-1-thread-1] o.s.s.s.TaskUtils$LoggingErrorHandler : Unexpected error occurred in scheduled task. 

java.lang.RuntimeException: Uh oh! 
    at com.mitchtalmadge.example.ExampleService.doSomething(ClassSyncService.java:48) ~[classes/:na] 
    at com.mitchtalmadge.example.ExampleService$$FastClassBySpringCGLIB$$1dd464d8.invoke(<generated>) ~[classes/:na] 
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.10.RELEASE.jar:4.3.10.RELEASE] 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:669) 
    ... 

如何明白了吗?

有没有简单的方法来做到这一点?

+0

为什么不使用** try-catch **? –

+1

您能否更详细地解释“a @Service抛出未处理的异常”的含义?谁调用引发异常的代码? – Oleg

+0

@MehrajMalik Try-catch在哪里?围绕每项服务的每种方法?未捕获的异常处理程序的一个要点是,它捕获了您未尝试使用try-catch的异常。 –

回答

2

您可以在spirngframework中使用aop,首先应该配置aop配置。

<bean id="aspect" class="com.zhuyiren.Main"/> 

<aop:config> 
    <aop:aspect ref="aspect"> 
     <aop:after-throwing method="after" throwing="ex" pointcut="execution(* com.zhuyiren.service..*.*(..)),args(ex)"/> 
    </aop:aspect> 
</aop:config> 

,然后你要声明一个类aspect方法已被命名为after

public class Main { 

public void after(JoinPoint point,Throwable ex){ 
    System.out.println(point); 
    System.out.println("catch error:"+ex.getMessage()); 
} 

当服务throwning一个错误,该方法将捕获并解决它。 在我的服务队,我做一个ArithmeticException,并运行应用程序,打印是:

execution(TeacherInfo com.zhuyiren.service.TeacherService.getTeacherInfo()) 
catch error:/ by zero 

当然,上面的配置是依赖于XML,你也可以通过做Annotation@Aspect@Pointcut@AfterThrowing

+0

很好,谢谢。 –