2012-05-17 24 views
5

¿Cómo puede ser esto? Parece claro como la luz del día una excepción de una biblioteca de terceros se está saltando mi bloque catch. No estoy seguro por dónde comenzar a solucionar este problema. O soy realmente estúpido o no entiendo algo sutil sobre excepciones y Java.Excepción de Java no detectada

Mi consola:

Exception: org.apache.james.mime4j.io.MaxLineLimitException: Maximum line length limit exceeded; stack: org.apache.james.mime4j.stream.MimeEntity.readRawField(MimeEntity.java:242); org.apache.james.mime4j.stream.MimeEntity.nextField(MimeEntity.java:258); org.apache.james.mime4j.stream.MimeEntity.advance(MimeEntity.java:296); org.apache.james.mime4j.stream.MimeTokenStream.next(MimeTokenStream.java:360); me.unroll.scanner.Scanner.<init>(Scanner.java:206); me.unroll.scanner.ScannerThread.run(ScannerThread.java:205); java.lang.Thread.run(Thread.java:722)

El problema es que mi código es el siguiente:

try { 
//... 
for(EntityState token = messageStream.getState(); 
    token != EntityState.T_END_OF_STREAM; 
    token = messageStream.next()) { //this is Scanner.java:206 
//... 
catch(ScanComplete exc) { } 
catch(MaxLineLimitException exc) { //line 282, matches "try" above 
    debug("Am I getting caught?"); //no, it's not 

estoy más

+0

Ponga una línea de depuración también en el bloque catch de ScanComplete. –

+4

¿Está seguro de que el nivel de registro es lo suficientemente alto para que se muestre una "depuración"? –

+2

ponga un punto de quiebre en la línea 283 y vea si recibe un golpe. (la línea de depuración) – MeBigFatGuy

Respuesta

5

Está intentando detectar el tipo de excepción incorrecto.

La firma para MimeTokenStream.next() dice que puede lanzar MimeException, que no está capturando. (Por cierto, si se está preguntando por qué no se detecta una excepción, puede intentar capturar Exception y registrar el tipo de excepción para ver lo que realmente se está lanzando)

Ahora, si mira el código fuente del real fuente de la excepción, la línea 242 de MimeEntity.readRawField, verá:

241  } catch (MaxLineLimitException e) { 
242   throw new MimeException(e); 
243  } 

Así que a pesar de que el mensaje de la consola diceMaxLineLimitException, a excepción real que está siendo lanzada por ese método es una MimeException. Intente capturar MimeException en su código en lugar de MaxLineLimitException, pero tenga en cuenta que MimeTokenStream.next() probablemente arroje MimeException por otros motivos además del que ha encontrado.

+1

Una adición a lo que @matts es que probablemente sea algún tipo de manejo de excepciones raíz donde informa la "causa raíz" y no la excepción envuelta (MimeException). Esa es la consola que muestra exeception.getCause() no solo la excepción. –

1

Una posibilidad es que la excepción se registra, posteriormente atrapado y no volver a tirar Puedes poner un punto de interrupción en la excepción y salir desde allí hasta que llegues a tu método.

1

'Variable miserable' es probablemente la correcta. Otra opción es que se haya importado la clase MaxLineLimitException incorrecta.

Cuestiones relacionadas