2017-02-07 1 views
0

So bekomme ich die folgende Ausnahme, wenn ein Benutzer eine Anfrage auf meiner Web-Anwendung auf einem Tomcat-Anwendungsserver gehostet bricht, mit Abhängigkeitsmanagement behandelt durch Maven:Wie Sie feststellen, ob eine Ausnahme ein ClientAbortException ist

ClientAbortException: java.net.SocketException: Connection reset 
    at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:406) 
    at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:480) 
    at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366) 
    at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:431) 
    at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:419) 
    at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:91) 
    ... 

I Haben Sie eine Spring @ControllerAdvice Klasse, die alle Ausnahmen behandelt und eine E-Mail sendet.

@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); 
} 

aber ich möchte nicht, die E-Mail senden, wenn es diese ClientAbortException ist.

Ich möchte so etwas wie dies tun:

if (!(e instanceof ClientAbortException)) { 
    //send email with details of error 
} 

Aber ClientAbortException scheint nicht auf meinem Classpath zu sein, da es sich um eine Ausnahme in einem Tomcatbediener-Ebene lib enthalten ist.

Ich könnte überprüfen, ob e instance of SocketException, aber ich könnte andere SocketException s vermissen, die mir wichtig sind. Meine nächste Idee war so etwas wie:

e instanceof SocketException && e.getMessage().contains("Connection reset") 

Aber es scheint, als ob es eine einfache Möglichkeit, dies zu tun sein sollte.

Irgendwelche Ideen?

Antwort

0

Ich schaue auf Java Doc und die ClientAbortException ist Kind von IOException, so dass Sie keine Instanz von SocketException verwenden können.

Auf meiner Version von tomcat des Code, der die Ausnahme auslöst ist:

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); 
     } 
    } 

Ich glaube, Sie gerade einen neuen Exception-Handler für Sie Client abbrechen Ausnahme erstellen. Verwenden Sie die Instanz nicht für verschiedene Ausnahmen.

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

} 

können Sie die @Order Anmerkung verwenden, um den precedence of exceptions zu konfigurieren.

Verwandte Themen