我正在编码下载文件控制器
有时,用户会在文件完全写入之前关闭浏览器窗口。 -太酷了。
问题是我的日志中充满了此错误:
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。
答案 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
}
到目前为止效果很好。