2016-03-29 13 views
2

SpringMVC denetleyicilerindeki istisnaları işlemek için bir @ControllerAdvice sınıfım var. Bir @ExceptionHandler yönteminde bilinen bir tür (RuntimeException) istisnası yakalamak ve e.getCause() istisnasını atmak ve bu istisnayı aynı @ControllerAdvice sınıfı tarafından yakalanmış olmak istiyorum.Başka bir işleyici tarafından yakalanmak için @ExceptionHandler öğesinden bir istisna atmak

örnek kod:

@ControllerAdvice 
public class ExceptionHandlingAdvice 
{ 
    @ExceptionHandler(RuntimeException.class) 
    private void handleRuntimeException(final RuntimeException e, final HttpServletResponse response) throws Throwable 
    { 
     throw e.getCause(); // Can be of many types 
    } 

    // I want any Exception1 exception thrown by the above handler to be caught in this handler 
    @ExceptionHandler(Exception1.class) 
    private void handleAnException(final Exception1 e, final HttpServletResponse response) throws Throwable 
    { 
     // handle exception 
    } 
} 

bu mümkün mü?

cevap

0

doğrudan yöntemini o RuntimeException Exception1.class örneği olup olmadığını kontrol edin ve çağırabilirsiniz:

private void handleRuntimeException(final RuntimeException e, final HttpServletResponse response) throws Throwable 
{ 
    if (e instanceof Exception1) handleAnException(e,response); 
    else throw e.getCause(); // Can be of many types 
} 
+0

RuntimeException asla Exception1 bir alt sınıf olacak çünkü çek işe yaramaz eğer o. Dahası, e.getCause() 'ın çok farklı istisna tiplerine dönebileceği durumda, if-else-if ifadelerinin büyük bir çirkin bloğu ile sonuçlanacağı durumlarda, handleAnException ile açıkça çağrılabileceğimi biliyorum. uygun işleyiciyi el ile çağırarak. Daha sonra, bu tür için doğru işleyiciyi açıkça çağırmayı ve her tür için yeni bir koşul eklediğini hatırlamanız gerekir. Sadece istisnayı yeniden atayabiliyor ve ControllerAdvice'i de yakalayabiliyor olsaydınız çok daha temiz olurdu. – agentgonzo

+0

Üzgünüm, anladım ve Exception1'in RuntimeException sınıfını genişleteceğini düşünmüştüm ve bu işleyiciden gitmemesinin sebebi buydu. Yeni bir Exception1 (e.getCause()) atmak kadar kolay değil; e.getCause() atmak yerine? – Mayday

+0

Maalesef, yeni bir istisna atmak işleyici tarafından yakalanmıyor, sadece işleyiciden çıkıp çıkıyor ve web kapsayıcısında 500 hataya neden oluyor – agentgonzo

İlgili konular