怎么会这样?看起来像白天一样,来自第三方库的异常正在跳过我的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
Run Code Online (Sandbox Code Playgroud)
我更
您正试图捕获错误的异常类型.
签名MimeTokenStream.next()说它可以扔MimeException,你没有捕捉.(顺便说一句,如果你想知道为什么没有捕获异常,你可以尝试捕获Exception并记录异常类型以查看实际被抛出的内容.)
现在,如果您查看异常实际来源的源代码(第242行)MimeEntity.readRawField,您将看到:
241 } catch (MaxLineLimitException e) {
242 throw new MimeException(e);
243 }
Run Code Online (Sandbox Code Playgroud)
因此,即使控制台消息说 MaxLineLimitException,该方法抛出的实际异常是MimeException.尝试捕捉MimeException你的代码而不是MaxLineLimitException,但要注意除了你遇到的那个之外,MimeTokenStream.next()它可能会抛出MimeException其他原因.
| 归档时间: |
|
| 查看次数: |
1581 次 |
| 最近记录: |