【问题标题】:How to Properly Handle Exceptions in a JSP/Servlet App?如何正确处理 JSP/Servlet 应用程序中的异常?
【发布时间】:2011-09-05 04:22:20
【问题描述】:

如何正确处理 servlet 中遇到的错误?现在,我继承的应用程序(仅使用普通 JSP/Servlet)有一个名为 Controller 的超类,它扩展了 HttpServlet 并且所有其他 servlet 都从它扩展而来。在那个Controller 类中是一个try and catch 块,如下所示:

try {
    // execute doPost or doGet here
} catch (Exception e) {
    // show a generic error page
}

这是正确的做法吗?它看起来很笨重,而且似乎并不总是有效。我只是一个实习生,所以我没有很多这方面的经验。有什么建议吗?我正在努力使应用程序更强大..

【问题讨论】:

标签: java jsp servlets


【解决方案1】:

标准的做法是让您的 Servlet 的 doXxx() 方法(例如 doGet()doPost() 等)抛出一个 ServletException 并让容器捕获并处理它。您可以使用<error-page> 标签指定要在WEB-INF/web.xml 中显示的自定义错误页面:

<error-page>
    <error-code>500</error-code>
    <location>/error.jsp</location>
</error-page>

如果您最终捕获到无法优雅处理的 Exception,只需将其包裹在 ServletException 中,如下所示:

try {
    // code that throws an Exception
} catch (Exception e) {
    throw new ServletException(e);
}

【讨论】:

  • 哦,我以为 只是为了处理 JSP 中遇到的异常。
  • @Damian:相反,应该在 servlet 中处理异常,远在将任何位写入响应之前。在 JSP 中抛出异常并因此突然中止其流程只会冒响应以空白页面和/或半生不熟的 HTML 告终的风险,因为 JSP 可能已经在发送响应,这是一个不归路。
  • 将异常包装成 ServletException 有什么附加价值?
  • @geschema 您将从 Servlet 容器中获得一些默认的异常处理,例如向用户显示 html 错误页面并记录异常堆栈跟踪以供以后调试。
  • 好吧,这是有道理的。谢谢@Asaph
【解决方案2】:

或者您可以使用 servlet 拦截所有异常:

<!-- WEB-INF/web.xml -->
<servlet>
    <servlet-name>ErrorServlet</servlet-name>
    <servlet-class>com.domain.MyErrorServlet</servlet-class>
</servlet>    
<servlet-mapping>
<servlet-name>ErrorServlet</servlet-name>
    <url-pattern>/error</url-pattern>
</servlet-mapping>
<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/error</location>
</error-page>

然后在servlet中你可以像这样处理异常

public class MyErrorServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response){
       Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
       // You can log the exception, send to email, etc
    }
}

【讨论】:

  • 这不是问题所在。
  • 所有异常还是只处理未处理的?
  • 你确定吗?因为我已经尝试过了,它只在发生未捕获的异常时将请求转发到错误 servlet。
  • 所有 *未处理的异常
【解决方案3】:

当涉及到异常时,有一些最佳做法。通常,您可以处理它、让它冒泡(对于未经检查的异常)、记录它或包装它。

您应该避免捕获和抛出异常,而是捕获更具体的异常,或者创建自己的异常类型并将当前异常包装在其中。

这是一个很好的资源,可用作例外情况的“不该做什么”: http://today.java.net/article/2006/04/04/exception-handling-antipatterns

【讨论】:

    【解决方案4】:

    在 JSP 中你可以使用 jstl 核心库

    1) 在 JSP 文件之上导入 tablib

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    

    2) 使用标签

    <c:catch var="myExceptionObject">
        Code that might throw Exception
    </c:catch>
    
    <c:if test="${myExceptionObject} != null">
        There was an exception: ${myExceptionObject.message}
    </c:if>
    

    【讨论】:

    • 需要更改符号'/':可能抛出异常的代码 出现异常:${myExceptionObject.message}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2014-05-11
    • 2018-05-20
    • 2015-11-30
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    相关资源
    最近更新 更多