2012-05-17 21 views
5

Come può essere? Sembra chiaro come un'eccezione da una libreria di terze parti sta saltando il mio blocco di cattura. Non so da dove iniziare a risolvere questo problema. Sono io che sono veramente stupido o non capisco qualcosa di sottile sulle eccezioni e su Java.Eccezione Java non rilevata

mia console:

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)

problema è il mio codice simile a questo:

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 

Sono più

+0

Inserire anche una riga di debug nel blocco di cattura ScanComplete. –

+4

Sei sicuro che il livello di log sia abbastanza alto da far apparire un 'debug'? –

+2

metti un punto di interruzione sulla riga 283 e controlla se viene colpito. (la linea di debug) – MeBigFatGuy

risposta

5

Si sta tentando di rilevare il tipo di eccezione errato.

La firma per MimeTokenStream.next() dice che è possibile lanciare MimeException, che non si sta catturando. (Se ti stai chiedendo perché non viene rilevata un'eccezione, puoi provare ad intercettare il tipo di eccezione per vedere cosa viene effettivamente lanciato.)

Ora, se si guarda il codice sorgente per l'effettivo fonte di eccezione, la linea, vedrete 242 di MimeEntity.readRawField:

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

Così, anche se il messaggio di console diceMaxLineLimitException, l'eccezione effettiva essere gettato da quel metodo è un MimeException. Prova a prendere MimeException nel tuo codice invece di MaxLineLimitException, ma fai attenzione che lo MimeTokenStream.next() può probabilmente generare MimeException per altri motivi oltre a quello che hai incontrato.

+1

Un addendum a ciò che @matts è che probabilmente è una sorta di gestione delle eccezioni di root in cui riporta la "Root Cause" e non l'eccezione avvolta (MimeException). Questa è la console che mostra exeception.getCause() non solo l'eccezione. –

1

Una possibilità è che l'eccezione è stato registrato, in seguito catturato e non ripubblicato. Puoi mettere un breakpoint sull'eccezione stessa e uscire da lì fino a raggiungere il tuo metodo.

1

"Miserable Variable" ha probabilmente ragione. Un'altra opzione è che hai importato la classe MaxLineLimitException sbagliata.

Problemi correlati