2013-12-11 4 views
7

Ich möchte den folgenden Tomcat ClientAbortException fangen und ignorieren. Da ist es unnötig, darauf für mein Programm zu achten.Wie zu fangen und Ignorieren org.apache.catalina.connector.ClientAbortException

Irgendeine Idee, wie und wo ich diese Ausnahme fangen kann? Unten ist die Ausnahme:

14:46:43.920 [ajp-bio-8029-exec-538] ERROR com.sok.runway.URLFilter - Exception in URLFilter 
org.apache.catalina.connector.ClientAbortException: null 
     at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:388) ~[catalina.jar:7.0.26] 
     at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:462) ~[tomcat-coyote.jar:7.0.26] 
     at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:366) ~[tomcat-coyote.jar:7.0.26] 
     at org.apache.catalina.connector.OutputBuffer.writeBytes(OutputBuffer.java:413) ~[catalina.jar:7.0.26] 
     at org.apache.catalina.connector.OutputBuffer.write(OutputBuffer.java:401) ~[catalina.jar:7.0.26] 
     at org.apache.catalina.connector.CoyoteOutputStream.write(CoyoteOutputStream.java:91) ~[catalina.jar:7.0.26] 
     at org.apache.catalina.servlets.DefaultServlet.copyRange(DefaultServlet.java:2031) ~[catalina.jar:7.0.26] 
     at org.apache.catalina.servlets.DefaultServlet.copy(DefaultServlet.java:1870) ~[catalina.jar:7.0.26] 
     at org.apache.catalina.servlets.DefaultServlet.serveResource(DefaultServlet.java:958) ~[catalina.jar:7.0.26] 
     at org.apache.catalina.servlets.DefaultServlet.doGet(DefaultServlet.java:411) ~[catalina.jar:7.0.26] 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:621) ~[servlet-api.jar:na] 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) ~[servlet-api.jar:na] 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) [catalina.jar:7.0.26] 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.26] 
     at com.sok.runway.URLFilter.doFilter(URLFilter.java:130) ~[runway-dev.jar:na] 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) [catalina.jar:7.0.26] 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) [catalina.jar:7.0.26] 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) [catalina.jar:7.0.26] 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) [catalina.jar:7.0.26] 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) [catalina.jar:7.0.26] 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) [catalina.jar:7.0.26] 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) [catalina.jar:7.0.26] 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927) [catalina.jar:7.0.26] 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) [catalina.jar:7.0.26] 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) [catalina.jar:7.0.26] 
     at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200) [tomcat-coyote.jar:7.0.26] 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579) [tomcat-coyote.jar:7.0.26] 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:307) [tomcat-coyote.jar:7.0.26] 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) [na:1.7.0_03] 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) [na:1.7.0_03] 
     at java.lang.Thread.run(Thread.java:722) [na:1.7.0_03] 
Caused by: java.net.SocketException: Connection reset 
     at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113) ~[na:1.7.0_03] 
     at java.net.SocketOutputStream.write(SocketOutputStream.java:153) ~[na:1.7.0_03] 
     at org.apache.coyote.ajp.AjpProcessor.output(AjpProcessor.java:295) [tomcat-coyote.jar:7.0.26] 
     at org.apache.coyote.ajp.AbstractAjpProcessor$SocketOutputBuffer.doWrite(AbstractAjpProcessor.java:1082) ~[tomcat-coyote.jar:7.0.26] 
     at org.apache.coyote.Response.doWrite(Response.java:533) ~[tomcat-coyote.jar:7.0.26] 
     at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:383) ~[catalina.jar:7.0.26] 

Antwort

9

da Sie wahrscheinlich, nicht eine Abhängigkeit Catalina möchten Sie die Exception wie diese ignorieren kann (Ich gehe davon aus das ClientAbortException ist die Ursache):

String simpleName = e.getCause().getClass().getSimpleName(); 
if (simpleName.equals("ClientAbortException")) { 
    // ignore 
} else { 
    // do whatever you do 
} 
1

ClientAbortException erstreckt IOException. Sie können den Code unten versuchen, die Ausnahme zu fangen:

try { 
    // codes 
    out.write("xyz"); // throws IOException 
} catch (org.apache.catalina.connector.ClientAbortException ca) { 
    System.out.println("ClientAbortException caught"); 
} catch (IOException ioe) { 
    System.out.println("i/o exception raised. abrorting."); 
} 
+0

Aber meine Frage mehr wie wo soll ich diese Ausnahme im Code fangen? In welcher Klasse muss ich diesen catch-Block hinzufügen? – user3007165

+0

dafür müssen Sie Ihre Codes veröffentlichen und versuchen, Ihren Code zu debuggen, so dass Sie genau wissen können, an welchem ​​Punkt Sie die Ausnahme erhalten, und versuchen Sie dann, diese Codes in try catch zu setzen. –

4

Im Frühling 4 würden Sie dies in eine Klasse schreiben, die mit @ControllerAdvice gekennzeichnet ist. Der Trick ist, nur ClientAbortException zu unterdrücken, während alle andere IOException ermöglicht als Fehler oder protokolliert behandelt werden, ohne dass eine Kompilierung/runtime Abhängigkeit von Ihrem Container API Einführung:

import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

//import org.apache.catalina.connector.ClientAbortException; // We don't want this dependency. 
import org.springframework.web.bind.annotation.ControllerAdvice; 
import org.springframework.web.bind.annotation.ExceptionHandler; 
import org.springframework.web.servlet.NoHandlerFoundException; 

@ControllerAdvice 
public final class ErrorController 
{ 
    @ExceptionHandler(NoHandlerFoundException.class) 
    public String handleNoHandlerFoundException(final NoHandlerFoundException ex) 
    { 
     return "notFoundPage"; 
    } 

    @ExceptionHandler(IOException.class) 
    public String handleAbortedConnection(final IOException ex) 
    { 
     // avoids compile/runtime dependency by using class name 
     if (ex.getClass().getName().equals("org.apache.catalina.connector.ClientAbortException")) 
     { 
      return null; 
     } 

     // log and return error page for any other IOExceptions 
     if (LOGGER.isLoggable(Level.WARNING)) 
     { 
      LOGGER.log(Level.WARNING, "IO Error", ex); 
     } 

     return "errorPage"; 
    } 

    @ExceptionHandler(Exception.class) 
    public String handleException(final Exception ex) 
    { 
     if (LOGGER.isLoggable(Level.SEVERE)) 
     { 
      LOGGER.log(Level.SEVERE, "Server Error", ex); 
     } 
     return "errorPage"; 
    } 
} 

Dank dieser Antwort für das fehlende Stück bietet, wo wir return null for the view name to avoid throwing a SocketException on the closed OutputStream.

Verwandte Themen