【问题标题】:Java EE / Struts Exception HandlingJava EE / Struts 异常处理
【发布时间】:2013-04-15 11:30:30
【问题描述】:

我已经开始主要基于 Struts 和 Servlet 开发 Java EE Web 应用程序。大多数代码在 Servlet 或 Struts Action 类中都有一个 try catch 块。

是否必须为每个 servlet 或操作设置 try catch 块?我看到这种代码模板的唯一优点是堆栈跟踪是日志到应用程序指定的日志框架,例如 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
    }
   }
}

【问题讨论】:

  • 如果您现在开始,请使用 Struts2,而不是 Struts !除非您使用 Java 1.4,否则您正在开发 Java EE webapp,而不是 J2EE:en.wikipedia.org/wiki/…

标签: java exception servlets error-handling struts


【解决方案1】:

您可以在struts-config.xml 中指定全局异常。它在整个应用程序中捕获未处理的异常。 您需要实现自己的ExceptionHandler 类。然后写代码想做什么。

4.5 异常处理程序 http://www.jajakarta.org/struts/struts1.2/documentation/ja/target/userGuide/building_controller.html

【讨论】:

    【解决方案2】:
    1. 捕捉Exception 几乎从来都不是你真正想做的事情。希望很明显,总是有一个 try/catch 块并不是强制性的——这取决于底层代码在做什么,以及您希望如何处理它可能抛出的任何异常。

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

    我建议反对在 Struts 1 中使用过滤器来处理异常,因为它已经内置了一个机制。如果在框架级别存在异常,它们无论如何都会显示出来,而且它们通常表示开发问题,而不是运行时问题。

    我赞同 Andrea 的观点:除非你有一个非常好的理由,否则学习 Struts 1 是没有用的。请考虑使用 Struts 2 或 Spring MVC 进行“传统”框架开发,或者考虑使用 Play、Grails、JRuby on Rails 等进行更现代的方法。

    【讨论】:

    • 我正在写我的答案,而我看到你的答案出现了.. ;-) +1 用于使用 Struts 异常处理。我在 web 应用程序中的经验法则是在控制器 (Action) 中抛出每个异常并使用 ExceptionHandler 处理它们。当我看到 try..catch 块时,我的眼睛总是闪烁!
    • 你忽略了遗留代码,而且还有很多。 Struts 1x 很有用,因为仍有大量遗留代码在使用它。我在他们在同一家商店同时使用 Struts 1 和 2 的环境中工作。在成本可行的情况下,我们正在将所有应用程序迁移到 Struts 2。
    • @JamesDrinkard 我没有忽略任何事情;我特别指出“除非你有很好的理由”。
    • @DaveNewton 正确,那肯定是合格的。感谢您指出这一点!
    【解决方案3】:

    如果您正在寻找一个地方进行异常日志记录,您可以创建 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 }
        }
     }
    

    除非你想以一种特殊的方式处理那个特定的异常,否则你不应该真的必须在任何地方捕获异常。大多数时候,它只是干扰“真实”代码的噪音。重要的是记录异常和足够的上下文信息,以便找出导致错误的原因。对于用户,您可能应该只显示一个一般错误页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多