How do you properly handle errors encountered in a servlet? Right now, the app that I inherited (uses only plain JSP/Servlet) has a superclass called Controller
which extends HttpServlet
and which all other servlets extend from. In that Controller
class is a try and catch block like the following:
try {
// execute doPost or doGet here
} catch (Exception e) {
// show a generic error page
}
Is this the proper way of doing it? It seems clunky and doesn't seem to always work. I'm only an intern so I don't have a lot of experience with this. Any advice? I'm trying to make the app for robust..
The standard thing to do is have your Servlet's doXxx()
method (eg. doGet()
, doPost()
, etc.) throw a ServletException
and allow the container to catch and handle it. You can specify a custom error page to be shown in WEB-INF/web.xml
using the <error-page>
tag:
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
If you end up catching an Exception
you can't elegantly handle, just wrap it in a ServletException
like this:
try {
// code that throws an Exception
} catch (Exception e) {
throw new ServletException(e);
}
Or you can intercept all your exceptions using a 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>
Then in the servlet you can handle the exception like this
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
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With