如何仅处理ClientAbortException?

时间:2018-08-23 19:27:48

标签: java tomcat exception exception-handling

我正在编码下载文件控制器
有时,用户会在文件完全写入之前关闭浏览器窗口。 -太酷了。

问题是我的日志中充满了此错误:

  

org.apache.catalina.connector.ClientAbortException:java.io.IOException:已建立的连接被主机中的软件中止了            在org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:333)            在org.apache.catalina.connector.OutputBuffer.flushByteBuffer(OutputBuffer.java:758)            在org.apache.catalina.connector.OutputBuffer.append(OutputBuffer.java:663)            在org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:368)            在org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:346)            在org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:96)            在org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2147)            在org.apache.commons.io.IOUtils.copy(IOUtils.java:2102)            在org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:2123)            在org.apache.commons.io.IOUtils.copy(IOUtils.java:2078)

当我尝试仅捕获此特定的日蚀时,会说:

  

ClientAbortException无法解析为类型

我的项目设置正确且正在正常运行,因此有可能仅捕获此特定异常:

   org.apache.catalina.connector.ClientAbortException

在发生另一场灾难时,我想保留IOException。

try catch structure

3 个答案:

答案 0 :(得分:1)

ClientAbortException源自IOException。您必须检查导致IOException e的异常是什么:

...
} catch (FileNotFoundException fnfe) {
    // ... handle FileNotFoundException
} catch (IOException e) {
    String exceptionSimpleName = e.getCause().getClass().getSimpleName();
    if ("ClientAbortException".equals(exceptionSimpleName)) {
        // ... handle ClientAbortException
    } else {
        // ... handle general IOException or another cause
    }
}
return null;

答案 1 :(得分:1)

(截至@Nikolas Charalambidis 的回答)

  • 忽略"org.apache.catalina.connector.ClientAbortException:java.io.IOException: Connection reset by peer"

    <块引用>

    e.getCause().getClass().getSimpleName() == "IOException"

    <块引用>

    e.getMessage() == "java.io.IOException: Connection reset by peer"

  • 并且不处理一般的 IOException 和其他原因

     ...    
     } catch (IOException e) {
         if (! e.getMessage().contains("Connection reset by peer")) {
             throw e;
         }
    
     } finally {
         close(output);
         close(input);
     }
     ...
    

答案 2 :(得分:0)

我通常不像在查找某个类名(将您的应用程序绑定到一个特定的servlet容器)那样,在写IOExceptions时与在读IOExceptions时进行不同的处理,就像这样(很伪的代码):

try {
  byte[] buffer = ...
  in.read(buffer);
  try {
    out.write(buffer);
  } catch (IOException writeException) {
    // client aborted request
  }
} catch (IOException readException) {
  // something went wrong -> signal 50x or something else
}

到目前为止效果很好。