2013-04-22 160 views
1

我已經開始主要在Struts和Servlet上開發Java EE Web應用程序。大多數代碼在Servlet或Struts Action類中都有一個try catch塊。Java EE/Struts異常處理

是否必須爲每個servlet或動作都嘗試catch塊?我用這種代碼模板看到的唯一優點是stacktrace會記錄到應用程序指定的日誌框架(如log4j)。

如果運行時異常浮動,它將被打印在服務器(Tomcat/GlassFish/Weblogic)日誌上。

public class HelloWorldAction extends Action{ 

    public ActionForward execute(ActionMapping mapping,ActionForm form, 
     HttpServletRequest request,HttpServletResponse response) 
     throws Exception { 

     try { 
      // do all the processing here 
     } catch (Exception e) { 
      // log all exceptions 
     } 
    } 

} 


public class HelloWorldExample extends HttpServlet { 

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
       throws IOException, ServletException { 
    try { 
     // do all the processing here 
    } catch (Exception e) { 
     // log all exceptions 
    } 
    } 
} 
+0

如果你現在開始,請使用Struts2的,不是Struts的!除非你使用Java 1.4,否則你正在開發一個Java EE web應用程序,而不是J2EE應用程序:http://en.wikipedia.org/wiki/Java_Platform,_Enterprise_Edition#Version_History – 2013-04-22 14:13:12

回答

4
  1. 捕捉Exception幾乎從來沒有你真正想做的事情。希望很明顯,它不是強制性的總是有一個try/catch塊–它取決於底層代碼在做什麼,以及如何處理它可能拋出的異常。

  2. 捕獲Exception消除了使用Struts' declarative exception handling的能力。

我會使用過濾器來處理Struts中1例外,因爲它已經內置了一個機制,建議。如果有在他們將反正顯示的框架水平異常,他們通常指示一個開發,而不是運行時問題。

我重複了Andrea的觀點:除非你有一個很好的理由,否則學習Struts 1是沒有用的。考慮使用Struts 2或Spring MVC來實現「傳統」框架開發,或者使用Play,Grails,JRuby on Rails等,以獲得更現代的方法。

+0

我正在寫我的答案,而我看到你的潛水員。 .-- +1使用Struts異常處理。我在web應用程序中的經驗法則是在控制器(Action)上拋出所有異常,並使用ExceptionHandler處理它們。當我看到try..catch塊時,我的眼睛總是閃爍! – Cygnusx1 2013-04-22 15:20:24

+0

你忽略了遺留代碼,並且還有很多。 Struts 1x是有用的,因爲仍然有很多使用它的遺留代碼。我在一個他們在同一商店中使用Struts 1和2的環境中工作。在成本可行的情況下,我們正在將所有應用程序遷移到Struts 2。 – 2014-02-05 16:51:12

+0

@JamesDrinkard我不會忽視任何事情;我特別聲明「除非你有一個非常好的理由」。 – 2014-02-05 17:37:34

1

如果你正在尋找一個地方做的異常記錄,您可以創建ServletFilter中:

public class ExceptionLoggerFilter implements Filter { 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) { 
     try { 
      filterChain.doFilter(req, res); 
     } 
     catch(Exception e) { // Log exception } 
    } 
} 

你不應該真的要到處捕捉異常,除非你想處理特定的例外一種特殊的方式。大多數時候,這只是噪音阻礙了「真正」的代碼。重要的是你記錄了異常和足夠的上下文信息,你可以找出造成錯誤的原因。對用戶來說,你應該只是顯示一個通用的錯誤頁面。