如何正确处理servlet中遇到的错误?现在,我继承的应用程序(仅使用普通的JSP / Servlet)有一个名为Controller
的超类,它扩展了HttpServlet
,并且所有其他servlet都扩展了它。在那个Controller
类中是一个try和catch块,如下所示:
try {
// execute doPost or doGet here
} catch (Exception e) {
// show a generic error page
}
这是正确的做法吗?它似乎很笨重,似乎并不总是奏效。我只是一名实习生,所以我对此没有太多经验。有什么建议?我正试图让应用程序变得健壮......
答案 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>