这怎么可能?看起来像白天一样,来自第三方库的异常正在跳过我的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
我更多
答案 0 :(得分: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 :(得分:1)
一种可能性是记录了异常,随后被捕获而不是重新抛出。您可以在异常本身上放置一个断点,然后从那里走出来,直到找到您的方法。
答案 2 :(得分:1)
'悲惨变量'可能是正确的。另一个选择是您导入了错误的MaxLineLimitException类。