Java 如何确定异常是否为ClientBortException

Java 如何确定异常是否为ClientBortException,java,spring,maven,tomcat,exception-handling,Java,Spring,Maven,Tomcat,Exception Handling,因此,当用户取消托管在Tomcat应用服务器上的web应用程序上的请求,并通过Maven处理依赖关系管理时,会出现以下异常: ClientAbortException:java.net.SocketException:连接重置 位于org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:406) 位于org.apache.tomcat.util.buf.ByteChunk.flushBuffer(By

因此,当用户取消托管在Tomcat应用服务器上的web应用程序上的请求,并通过Maven处理依赖关系管理时,会出现以下异常:

ClientAbortException:java.net.SocketException:连接重置
位于org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:406)
位于org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:480)
位于org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366)
位于org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:431)
位于org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:419)
位于org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:91)
...
我有一个Spring
@ControllerAdvice
类,它处理所有异常,并发送电子邮件

@ExceptionHandler(value = Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ResponseEntity defaultErrorHandler(final HttpServletRequest request, final Principal principal, final Exception e) {

    //send email with details of error

    return ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
}
但是,如果是此
ClientAbortException
,我不想发送电子邮件

我想这样做:

if (!(e instanceof ClientAbortException)) {
    //send email with details of error
}
但是
ClientAbortException
似乎不在我的类路径上,因为它是tomcat服务器级库中包含的一个异常

我可以检查是否是SocketException的
e实例
,但我可能会错过我关心的其他
SocketException
s。我的下一个想法是:

e instanceof SocketException && e.getMessage().contains("Connection reset")
但似乎应该有一种更直接的方法来做到这一点


有什么想法吗?

我查看了java文档,它是IOException的子对象,因此您不能使用to SocketException的实例

在我的tomcat版本中,引发异常的代码是:

if (cnt > 0) {
        // real write to the adapter
        outputChunk.setBytes(buf, off, cnt);
        try {
            coyoteResponse.doWrite(outputChunk);
        } catch (IOException e) {
            // An IOException on a write is almost always due to
            // the remote client aborting the request.  Wrap this
            // so that it can be handled better by the error dispatcher.
            throw new ClientAbortException(e);
        }
    }
我认为您只是为您的客户机创建了一个新的异常处理程序abort exception。不要在不同的异常上使用实例

@ExceptionHandler(value = ClientAbortException.class)
public ResponseEntity<ErrorResponse> handleClientAbort(Exception ex, HttpServletRequest req) {
    //YOUR HANDLER IMPLEMENTATION

}
@ExceptionHandler(value=ClientAbortException.class)
公共响应HandleClientPort(HttpServletRequest请求除外){
//您的处理程序实现
}
您可以使用@Order注释来配置