HttpServletResponse.getWriter()抛出IOException时应如何正确处理?
问题解答
是可以实现的,不需要获取可用的PrintWriter就能完成500状态码的返回。
核心原理
HTTP响应的状态码属于响应头范畴,设置状态码的操作不依赖响应体的输出流对象,只有写入响应体内容时才需要用到PrintWriter或者ServletOutputStream。
具体实现方案
你可以直接调用HttpServletResponse内置的两个原生方法完成状态码设置:
- 方案1:调用
sendError()方法
代码示例:response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)
这个方法除了设置500状态码之外,还会触发Servlet容器的内置错误页渲染逻辑,自动生成标准的500错误响应体返回给客户端,不需要你手动操作任何输出流。 - 方案2:调用
setStatus()方法
代码示例:response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR)
这个方法仅修改响应头的状态码,不会自动生成响应体,客户端会收到一个仅携带500状态码的空响应。
注意:上述两个方法都要求响应还未被提交(即还没有输出过响应内容、没有flush过输出流、响应头也还没有发送到客户端),如果响应已经提交,两个方法都会抛出非法状态异常,这种场景下没有办法再修改返回的状态码。
另外不需要在getWriter()抛出IO异常后尝试调用getOutputStream()获取输出流,这种情况下输出流大概率也已经不可用,调用只会额外抛出异常,没有实际意义。
内容的提问来源于stack exchange,提问作者Morris Town
相关产品推荐
相关产品推荐

