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

Dam*_*lls 12 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
}
Run Code Online (Sandbox Code Playgroud)

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

Don*_*rem 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>
Run Code Online (Sandbox Code Playgroud)

然后在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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是问题的关键所在. (3认同)

Asa*_*aph 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>
Run Code Online (Sandbox Code Playgroud)

如果你最终捕捉到一个Exception你无法优雅地处理,只需将它包装成ServletException如下:

try {
    // code that throws an Exception
} catch (Exception e) {
    throw new ServletException(e);
}
Run Code Online (Sandbox Code Playgroud)

  • @Damian:相反,应该在servlet中处理异常,远在将任何位写入响应之前.在JSP中抛出异常并因此突然中止其流程只会使响应最终成为空白页面和/或半翻录HTML的风险,因为JSP可能已经在发送响应中,这是一个不归路. (4认同)