2

Apache Xalan (v.2.7.1) を使用して、Apache Tomcat (v6.0.32) で XML を XHTML に変換しています。クライアントによって読み込みがキャンセルされ、次の例外がスローされることがあります。

javax.xml.transform.TransformerException: org.apache.xalan.xsltc.TransletException: ClientAbortException:  java.io.IOException
    at org.apache.xalan.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:636)
    at org.apache.xalan.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:303)
...

ログにスパムが送信されないように、ClientAbortException 例外をキャッチしたいと考えています。ただし、例外が ClientAbortException 内にネストされているかどうかを確認するにはどうすればよいですか? 私はこのようなことを試しました:

...
} catch (Exception e) {
    if (e.getCause() != null && e.getCause().getCause() instanceof org.apache.catalina.connector.ClientAbortException) {
        //do nothing
    } else {
        throw e;
    }
} finally {
...

しかし、最初の getCause には getCause がないため、nullpointerexception しか返されません。何か案は?

4

3 に答える 3

4

Apache Commons-langのメソッドを使用するExceptionUtils.getRootCause(Throwable)と、原因の連鎖をたどることができます。

于 2011-09-29T06:57:11.810 に答える
1

getCause()が null を返す場合、javax.xml.transform.TransformerException実際には原因がありません。例外が作成されたら、原因を特定する必要がありますが、おそらくこれが行われていません。あなたはおそらくそれについて何もできません。

かどうかを確認できます

1 つの方法は、Exception@getMessage で文字列の一致を使用することです。

...
} catch (Exception e) {
    if (e.getMessage().contains("ClientAbortException:")) {
        // at least log the error, in case you've got something wrong
    } else {
        throw e;
    }
} finally {
...

ただし、メッセージのテキストに依存するという明らかな理由から、これは信頼できない場合があります。

EDIT:考えてみると、この例外をキャッチするのは悪い考えである、またはコードが間違っていることが本番環境でわかる場合があるため、この動作をオンまたはオフにするメソッドを追加することは良い考えかもしれません:

...
} catch (Exception e) {
    if (System.getProperty("abort.when.ClientAbortException") == null && e.getMessage().contains("ClientAbortException:")) {
        // at least log the error, in case you've got something wrong
...

次に、少なくともコードをオフにするオプションがあります。System.getProperty は単なる例です。

于 2011-09-29T07:05:10.373 に答える