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

时间:2009-05-08 10:33:02

标签: java servlets

过去,当Servlet中的某些内容出现错误时,我一直在抛出ServletException,主要是在ServletException中包含异常。

现在我认为最好不要抛出ServletException,而是回复response.sendError(sc)并使用正确的HTTP状态代码。

如果我无法使用reponse.sendErrorIOException)发送错误,请将IOException包裹在ServletException中。

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

2 个答案:

答案 0 :(得分:23)

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

当请求信息无效或缺失时,我想将HTTP代码 400 Bad Request 返回给调用者。抛出ServletException会导致容器返回 500内部服务器错误,这表明服务器出现了问题,而不是请求。

这是我采用的解决方案。

  1. 创建一个扩展RequestException
  2. 的简单异常类Exception
  3. 使用抛出new RequestException(message)
  4. 的方法检查请求的有效性
  5. 在servlet的RequestException方法中抓取doPost,然后像这样调用HttpServletResponse.sendError()

    try {
        validateRequest(request);
        // Do stuff with a valid request.
    } catch (RequestException e) {
        response.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage());
    }
    
  6. 消息将返回给调用者,就像使用ServletException一样。

答案 1 :(得分:9)

最好抛出ServletException

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

如果您只使用sendError(),则无法在不同范围内执行此操作。