簡體   English   中英

如何在java中捕獲嵌套異常

[英]How to catch a nested exception in java

我正在使用 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。 有任何想法嗎?

使用 Apache Commons-lang 中的ExceptionUtils.getRootCause(Throwable)方法,它會為你遍歷原因鏈。

如果getCause()返回 null,則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 只是一個例子。

像這樣使用。 它工作正常。

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM