2013-02-11 171 views
2

我試圖擴展一些遺留代碼,使其更容忍網絡中斷。我有一些(遺留)groovy代碼,它通過wslite打包調用web服務(CallWebService)。有時候,這種調用拋出無論是wslite.http.HTTPClientException或java.net.ConnectException例外如何在java中捕捉異常拋出的異常?

調用該Groovy代碼的代碼(這已被添加 log.info("Exception " + ex.getClass().getName() + " throw"); 我log4j的日誌記錄來確定)是Java和如下所示:

public static String getDataFromWebService(String webServiceUrl, String referenceNumber) { 
try {  
    ReturnedData returnedData = new CallWebService(webServiceUrl, referenceNumber); 
    return (String)returnedData.toXml(); 
} 
catch (Exception ex) { 
    log.info("Exception caught: class of exception is " + ex.getClass().getName()); 
    throw ex; 
} 

我想要做的,是趕上拋出的異常(wslite.http.HTTPClientException或java.net.ConnectException),然後重試調用(因爲它可能是一個小故障)一次或兩次。

當我嘗試添加

catch (java.net.ConnectException ex) 

和建設,構建失敗,

exception ConnectException is never thrown in body of corresponding try statement 

我應該怎麼做才能夠捕捉和反應的適當的例外?

+0

編譯器錯誤告訴你ConnectException是一個檢查異常,它不被catch塊內的任何內容聲明。你確定你有正確的例外嗎? – jtahlborn 2013-02-11 15:29:55

+0

當然?不,但我得到我的log4j代碼來執行以下操作:log.info(「Exception」+ ex.getClass()。getName()+「throw」);它似乎給我java.net.ConnectException作爲例外 – Jane 2013-02-11 15:31:21

+1

的名稱是「頂級」異常,還是嵌套在另一個異常(例如HTTPClientException)? – jtahlborn 2013-02-11 15:39:34

回答

2

在Java代碼中,我會做這樣的事情:

try { 
    callGroovy(); 
} catch (RuntimeException e) { // EDIT --- Should be Exception, RuntimeException 
    if (e instanceof HTTPClientException || e.getCause() instanceof ConnectException) { 
    throw e; 
    } 
    // log other exception... 
} 

這會比單捕獲的異常類型更安全一點。根據我的經驗,像groovy這樣的動態語言更可能引發意料之外的運行時異常。捕捉所有運行時異常將確保常規異常不會感染程序的其餘部分。

+0

它似乎甚至沒有拋出一個運行時異常,只是冒泡入一個例外。在異常處理中,我可以做比較的實例。不知道,但... – Jane 2013-02-12 10:33:41

+0

糟糕。意思是把Exception作爲catch-ed類型,而不是RuntimeException,但看起來像你有想法。 – 2013-02-12 16:59:40