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ü?
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
Ü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
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