2017-08-16 104 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

很好,謝謝。 –