2017-08-16 1 views
2

Ich habe endlose Mengen von Tutorials zum Abfangen von nicht behandelten Ausnahmen in Spring MVC oder Spring REST finden können, aber was ich wissen möchte ist, wie Fangen Sie unbehandelte Ausnahmen ohne das Spring Web Framework überhaupt zu verwenden.So fangen Sie Nicht-MVC- und Nicht-REST-Ausnahmen in Spring Boot

Ich schreibe eine Anwendung, die keine Webkomponente hat, und ich werde Spring Web nur für die Ausnahmebehandlung nicht importieren.

Wenn eine @Service eine Ausnahme auslöst, die nicht behandelt wird, muss ich es abfangen, damit ich es richtig auf Raygun protokollieren kann.

Betrachten wir zum Beispiel diese Methode in einem Dienst, der absichtlich eine abgefangene Ausnahme wirft:

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

Sein Ausgang wird:

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) 
    ... 

Wie kann ich, dass zu fangen?

Gibt es keinen einfachen Weg, dies zu tun?

+0

Warum nicht ** try-catch ** verwenden? –

+1

Können Sie genauer erklären, was Sie mit "Ein @ Service löst eine Ausnahme, die nicht behandelt wird" meinen? Wer ruft den Code, der die Ausnahme auslöst? – Oleg

+0

@MehrajMalik Try-catch wo? Um jede Methode in jedem Service? Der Punkt eines nicht abgefangenen Ausnahmebehandlers ist, dass er die Ausnahmen abfängt, die Sie nicht mit einem try-catch erwartet haben. –

Antwort

2

Sie können den AOP in spirngframework verwenden, zuerst sollten Sie die AOP Konfiguration konfigurieren.

<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> 

und dann sollten Sie eine aspect Klasse hat Methode deklarieren after genannt werden:

public class Main { 

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

Wenn der Dienst einen Fehler throwning, das Verfahren wird es fangen und zu lösen. In meinem Sevice, ich eine ArithmeticException machen, und die Anwendung auszuführen, der Druck ist:

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

Natürlich ist die obige Konfiguration ist auf xml abhängt, auch Sie können es durch Annotation wie @Aspect, @Pointcut, @AfterThrowing.

+0

Funktioniert gut, danke. –

Verwandte Themen