Tüm catch
ifadelerinden kurtulmak, bunların hepsi dikkatsizce günlüğe kaydetmektir. catch
, hatayı işlemek, saklamamak içindir. Bütün bu yakalar kaldırıldıktan sonra
, Bahar MVC (1, 2, 3, ...) bir küresel istisna çözümleyicinizi yüklemek Basitçe bu önemsiz arabirimini uygulamak: istisna Resolverde olarak
public interface HandlerExceptionResolver {
ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);
}
basitçe olabilir istisna bir kez oturum açın ve işlenmemiş olarak dönün (null
döndürün), böylece web.xml
'daki hata eşlemeleri, uygun hata sayfasına yönlendirmeyi iletecektir. Ya da istisna kendiniz halledebilir ve bir hata sayfası oluşturabilirsiniz. En basit durumda AFAIK, kayıt istisnası çözümleyicisine ihtiyaç duymaz, sadece @Service
ile bir Spring bean/annotate olarak tanımlar.
Unutmayın, yalnızca ne yapacağınızı bildiğinizde özel durumu yakalayın. Günlüğe kaydetme yalnızca sorun giderme içindir, hiçbir şeyle baş etmez.
BTW bu:
log.warn(e.getMessage(), e);
sadece çok kötü bir istisna işleme olduğunu, ama aynı zamanda biraz yanlış. İstisnanızın bir mesajı yoksa, yığın izlemeden hemen önce gizemli null
görürsünüz. Eğer varsa, mesaj iki kez (Logback ile test) görüntülenir: özel durum mesajı çok uzun, özellikle bazen istenmeyen
22:51:23.985 WARN [main][Foo] OMG! - this is the exception message
java.lang.IllegalStateException: OMG! - this is the exception message
at Foo.bar(Foo.java:20) ~[test-classes/:na]
...,.
GÜNCELLEME: Kendi istisna logger org.springframework.web.servlet.HandlerExceptionResolver
ve org.springframework.core.Ordered
hem uygulamayı deneyin yazarken. getOrder()
, küçük işleyicinizin (0
gibi) geri döndürülmesi için işleyicinizin yerleşik işleyicilere göre öncelikli olması gerekir.
Yalnızca, işleyicimden önce çalışan org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
'un istisnayı kaydetmeden HTTP 500'ü döndürdüğü bana oldu.
Teşekkür ederiz. Bu harika! – Peachy