如何正确处理JSP / Servlet应用程序中的异常?

时间:2011-05-31 03:37:40

标签: java jsp servlets

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

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

这是正确的做法吗?它似乎很笨重,似乎并不总是奏效。我只是一名实习生,所以我对此没有太多经验。有什么建议?我正试图让应用程序变得健壮......

4 个答案:

答案 0 :(得分:17)

或者您可以使用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
    }
}

答案 1 :(得分:16)

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

<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);
}

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:1)

在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>