Как поймать вложенное исключение в Java - PullRequest
2 голосов
/ 29 сентября 2011

Я использую Apache Xalan (v.2.7.1) для перевода XML в XHTML в Apache Tomcat (v6.0.32).Иногда загрузка отменяется клиентом, и выдается следующее исключение:

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.Есть идеи?

Ответы [ 2 ]

3 голосов
/ 29 сентября 2011

Используйте метод ExceptionUtils.getRootCause(Throwable) в Apache Commons-lang, он пересечет цепочку причин для вас.

1 голос
/ 29 сентября 2011

Если getCause() возвращает ноль, то у javax.xml.transform.TransformerException на самом деле нет причины.Когда создается исключение, вам нужно указать причину, и они, вероятно, этого не сделали.Вы, вероятно, не можете ничего с этим поделать.

Вы можете проверить, может ли

Один метод просто использовать совпадение строк в 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 {
...

Однако это может быть ненадежным по очевидной причине, которая зависит от текста сообщения.

РЕДАКТИРОВАТЬ: Думая об этом, вы можете обнаружить в производстве, что перехват этого исключения - плохая идея, иличто вы ошиблись в коде, поэтому хорошей идеей может быть добавление метода для включения или отключения этого поведения:

...
} 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 является лишь примером.

...