5

怎么会这样?看起来像白天一样简单,第三方库的异常正在跳过我的 catch 块。不知道从哪里开始解决这个问题。要么我真的很愚蠢,要么我不了解异常和 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

我更

4

3 回答 3

5

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

for 的签名MimeTokenStream.next()说它可以 throw MimeException,你没有抓住它。(顺便说一句,如果您想知道为什么没有捕获到异常,您可以尝试捕获Exception并记录异常类型以查看实际抛出的内容。)

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

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

因此,即使控制台消息显示 MaxLineLimitException该方法引发的实际异常是MimeException. MimeException尝试在您的代码中捕获而不是MaxLineLimitException,但请注意,除了您遇到的原因之外,它MimeTokenStream.next()可能会因其他原因而抛出。MimeException

于 2012-05-17T20:57:01.350 回答
1

“悲惨的变量”可能是对的。另一种选择是您导入了错误的 MaxLineLimitException 类。

于 2012-05-17T20:57:44.830 回答
1

一种可能性是异常被记录,随后被捕获并且没有被重新抛出。您可以在异常本身上放置一个断点,然后从那里跳出,直到到达您的方法。

于 2012-05-17T20:53:06.827 回答