1

我已经开始主要在 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
    }
   }
}
4

3 回答 3

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

  2. 捕获Exception消除了使用Struts 的声明性异常处理的能力。

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

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

于 2013-04-22T15:15:42.703 回答
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 }
    }
 }

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

于 2013-04-22T14:14:32.237 回答
0

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

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

于 2013-04-30T10:33:58.437 回答