什么时候可以从Servlet抛出ServletException?

Ray*_*urg 16 java servlets

ServletException过去,当Servlet中的某些东西出现问题时,我一直在扔s,大多只是将异常包装进去ServletException.

现在我认为实际上最好不要抛出一个ServletException但是要回应response.sendError(sc)并使用正确的HTTP状态代码.

如果我不能使用reponse.sendError(IOException)发送错误,我将其包装成IOExceptiona ServletException.

以上是更好的回应方式吗?什么时候可以抛出一个ServletException

pha*_*cle 23

我刚刚得出了与@alamar相反的结论.我的情况是编写一个REST样式的servlet,由Oracle数据库中的代码调用,而不是由人类调用.

我想在请求信息无效或丢失时将HTTP代码400 Bad Request返回给调用者.抛出a ServletException导致容器返回500内部服务器错误,该错误指出服务器有问题,而不是请求.

这是我采用的解决方案.

  1. 创建一个RequestException扩展的简单异常类Exception.
  2. 使用抛出的方法检查请求的有效性new RequestException(message).
  3. 抓住RequestExceptionservlet的doPost方法并调用HttpServletResponse.sendError()如下:

    try {
        validateRequest(request);
        // Do stuff with a valid request.
    } catch (RequestException e) {
        response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
    }
    
    Run Code Online (Sandbox Code Playgroud)

消息将返回给调用者,就像它一样ServletException.

  • @ADTC一个快速实验表明,Tomcat 7为`IOException`抛出_500内部服务器错误_,就像它对'ServletException`一样.我不知道这种行为是通过规范还是按照惯例. (3认同)

ala*_*mar 9

最好扔一个ServletException.

您可以稍后使用error-page指令实际捕获此异常web.xml,并执行适当的操作:向用户显示一个奇特的错误页面,将异常连同堆栈跟踪一起发送给开发人员,将其写入日志等等.

如果您只是使用sendError(),则不能在不同程度上这样做.