2012-05-17 178 views
5

这怎么可能?看起来像白天一样,来自第三方图书馆的例外情况正在跳过我的catch块。不知道从哪里开始解决这个问题。这要么是我真的很愚蠢,要么是我不了解有关例外和Java的细微内容。Java异常未被捕获

我的控制台:

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)

问题是我的代码如下所示:

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 

我更

+0

还将一条调试线放入ScanComplete catch块中。 –

+4

您确定日志级别足够高以显示“调试”吗? –

+2

在第283行放置了一个断点,看它是否被击中。 (调试行) – MeBigFatGuy

回答

5

您试图捕获错误的异常类型。

MimeTokenStream.next()的签名表示可以抛出MimeException,这并不是你所追求的。 (顺便说一句,如果您想知道为什么没有捕获到异常,您可以尝试捕获Exception并记录异常类型以查看实际抛出的内容。)

现在,如果您查看实际的源代码异常的来源,行MimeEntity.readRawField 242,你会看到:

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

因此,即使控制台消息MaxLineLimitException,抛出的实际的异常通过该方法是一种MimeException。尝试在您的代码中使用MimeException而不是MaxLineLimitException,但要注意MimeTokenStream.next()除了您遇到的其他原因之外可能会因为其他原因而抛出MimeException

+1

@matts的附录可能是某种根异常处理,它报告“根本原因”而不是包装的异常(MimeException)。这是控制台显示exeception.getCause()不只是例外。 –

1

一种可能性是,异常被记录下来,随后抓住了而不是重新出现。你可以在异常本身上放置一个断点,并从那里出来,直到你到达你的方法。

1

'悲惨变量'可能是正确的。另一种选择是您导入了错误的MaxLineLimitException类。