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

2022-09-04 05:57:01

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

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

这是正确的方法吗?它似乎很笨拙,似乎并不总是有效。我只是一个实习生,所以我没有太多这方面的经验。有什么建议吗?我正在尝试使应用程序变得强大。


答案 1

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

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

如果你最终抓住了一个你无法优雅地处理,只需将其包装成这样:ExceptionServletException

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

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