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

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

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

这是做这件事的正确方法吗? 它似乎笨重,似乎并不总是工作。 我只是一个实习生,所以我没有太多的经验。 任何build议? 我正在努力使该应用程序健壮..

标准的做法是使用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); } 

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

 <!-- 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中你可以像这样处理exception

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

涉及到例外时,有几个最佳实践。 一般来说,你可以处理它,让它冒泡(对于未经检查的exception),logging它或包装它。

你应该避免捕获和抛出exception,而是捕获更具体的exception,或创build自己的exceptiontypes,并在当前的exception。

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

在JSP中,您可以使用jstl核心库

1)在JSP文件的顶部导入tablib

 <%@ taglib prefi x=”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/>