5

どうすればいいの?サードパーティのライブラリからの例外が私のキャッチブロックをスキップしているので、日中は明白に見えます。これのトラブルシューティングをどこから始めればよいかわからない。それは私が本当に愚かであるか、例外と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

間違った例外タイプをキャッチしようとしています。

の署名は、MimeTokenStream.next()それが投げることができると言ってMimeExceptionいますが、あなたはそれを捕まえていません。(ところで、なぜ例外がキャッチされないのか疑問に思っている場合はException、例外タイプをキャッチしてログに記録し、実際に何がスローされているかを確認できます。)

ここで、例外の実際のソースのソースコードであるの242行目を見ると、次のように表示されMimeEntity.readRawFieldます。

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

したがって、コンソールメッセージに「」と表示されていても、そのメソッドによってスローされる実際の例外はです 。の代わりにコードをキャッチしてみてください。ただし、遭遇した理由以外の理由でスローされる可能性があることに注意してください。MaxLineLimitExceptionMimeExceptionMimeExceptionMaxLineLimitExceptionMimeTokenStream.next()MimeException

于 2012-05-17T20:57:01.350 に答える
1

「悲惨な変数」はおそらく正しいです。もう1つのオプションは、間違ったMaxLineLimitExceptionクラスがインポートされていることです。

于 2012-05-17T20:57:44.830 に答える
1

1つの可能性は、例外がログに記録され、その後キャッチされ、再スローされなかったことです。例外自体にブレークポイントを設定し、メソッドに到達するまでそこからステップアウトできます。

于 2012-05-17T20:53:06.827 に答える