2011-07-03 18 views
8

Benim Bahar MVC uygulaması şuna benzer yöntemlerle doludur:Bir Spring MVC uygulamasında istisna işleminden istisna işlemine geçmek için en kolay yol nedir?

@RequestMapping(value = "/foo", method = RequestMethod.GET) 
public final void foo(HttpServletRequest request, ModelMap modelMap){ 
    try{ 
     this.fooService.foo(); 
    } 
    catch (Exception e){ 
     log.warn(e.getMessage(), e); 
    } 
} 

İstisnalar yakalanıp açmış ama aksi işlenmez. Yukarıdaki çağrılar fooService aynı şeyi yapar, hiçbir zaman denetleyiciye özel istisnalar atmaz, ancak onları yakalar ve günlüğe kaydeder. Yani, aslında bu denetleyici istisnası kodu asla çağrılmayacak.

Uygulamamda uygun istisna işlemlerini uygulamak için en iyi ve en basit yaklaşım nedir?

cevap

9

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.

+0

Teşekkür ederiz. Bu harika! – Peachy