2011-09-29 67 views
2

我在Apache Tomcat(v6.0.32)中使用Apache Xalan(v.2.7.1)將XML轉換爲XHTML。有時加載被客戶取消及以下異常被拋出:如何在java中捕捉嵌套的異常

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 { 
... 

但它只給我一個nullpointerexception,因爲第一個getCause沒有getCause。有任何想法嗎?

回答

3

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

+0

感謝您的提示,但ExceptionUtils.getRootCause似乎只返回「org.apache.xalan.xsltc.TransletException」,所以我猜這個異常沒有原因,因此無法使用嵌套的異常進行追蹤。 – brunnsbe

1

如果getCause()返回null,那麼javax.xml.transform.TransformerException實際上並沒有原因。當例外被創建時,你需要指定原因,他們可能沒有這樣做。你可能無法做任何事情。

您可以檢查

一種方法可能只是使用一個字符串匹配的異常@的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 { 
... 

然而,這可能是不可靠的,原因很明顯,它取決於消息的文本。

編輯:關於它的思考,你可能會發現在生產中捕捉這個異常是一個壞主意,或者你的代碼有錯誤,所以添加一個方法來打開或關閉這種行爲可能是一件好事idea:

... 
} 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只是一個例子。

+0

是的,這是一種可能(但有點難看)的解決方案,我想我必須去解決這個問題,因爲它似乎是「捕捉」特定異常的唯一可能方式。 – brunnsbe

+0

我同意這是醜陋的,但它似乎是唯一的方法。增加了關閉的選項。 –