[英]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.