2012-02-29 125 views
7

我想捕捉異常,記錄它,設置一個標誌,並且重新拋出同樣的異常的java:不能重新拋出異常:未處理的異常類型異常

我有這樣的代碼:

public Boolean doJobWithResult() { 
    boolean result = true; 
    final Feed feed = Feed.findById(feedId); 
    try { 
     feed.fetchContents(); 
    } catch (Exception ex) { 
     result = false; 
     Logger.info("fetching feed(%d) failed", feedId); 
     throw ex; 
    } 
    return result; 
} 

但是eclipse在throw ex時抱怨告訴「未處理的異常類型異常」,並建議我在它周圍添加一個try-catch塊。

其實,我想要的進程調用這個方法來處理異常,而不是處理它自己......我只是想,如果一切正常的話,如果有異常

在返回true,並將其記錄另一方面,我可以把例外包裝在另一個例外中,但我不能扔同一個例外。

任何想法?

回答

2

我認爲有各種各樣的事情在這裏提到:

  1. 要麼你想doJobWithResult()返回成功真假失敗或成功返回任何結果,失敗拋出異常。 兩者在同一時間是不可能的。在第一種情況下,捕獲異常,記錄它並返回false,在第二種情況下更改簽名返回void,並拋出一個異常和來電處理。
  2. 這是一個不要捕捉異常,登錄並重新拋出。爲什麼?因爲您的方法的潛在調用者不知道您已經記錄它,並且還記錄它。 要麼拋出一個異常(在這種情況下,調用者必須處理它)或抓住它並處理它(記錄它)。
  3. 注意扔Exception不給你的方法的調用什麼可能潛在地去錯在你的方法任何線索,它總是更好地拋出更具體的異常,或在用戶定義的一個包裝異常,並重新拋出。
  4. 此外,如果拋出Exception,調用者可能會試圖捕獲Exception,但不會注意到這也會捕獲每個RuntimeException(因爲它從Exception派生),這可能不是所期望的行爲。
+0

所有的答案是非常有用的,我想這其中也提供了有關如何處理例外的幾點提示... – opensas 2012-02-29 13:45:19

2

由於Exceptionchecked,再追一個替代的Exception是宣佈你的方法把它扔:

public Boolean doJobWithResult() throws Exception { 
    // ... 
} 
7

你doJobWithResult方法需要聲明的是它能夠拋出異常:

public Boolean doJobWithResult() { 

變成

public Boolean doJobWithResult() throws Exception { 
3

如果doJobWithResult不必處理異常,則刪除catch塊並向方法簽名添加「throws Exception」。異常日誌記錄可以在必須在相應的try/catch塊中處理異常的類/方法中完成。

2

沒有必要在catch塊中將結果設置爲false,因爲值不會被返回(因爲我們拋出異常)。

你的方法還應該聲明它拋出一個異常,所以客戶端將被迫處理它。

另外考慮使用一個更具體的例外,這將在這種特殊情況下拋出。

4

如果您將throws Exception添加到您的方法簽名中,則可以拋出相同的異常。 否則你可以扔RuntimeException

public Boolean doJobWithResult() { 
    boolean result = true; 
    final Feed feed = Feed.findById(feedId); 
    try { 
     feed.fetchContents(); 
    } catch (Exception ex) { 
     result = false; 
     Logger.info("fetching feed(%d) failed", feedId); 
     throw new RuntimeException(ex); 
    } 
    return result; 
} 

在這種情況下,你不會需要指出public Boolean doJobWithResult()拋出的東西,但要確保你處理得當以後(捕或希望您的線程停止......這是一個RuntimeException畢竟)。

0

你可以拋出一個未經檢查的異常

Logger.info("fetching feed(%d) failed", feedId); 
throw new RuntimeException(ex); 
1

添加throws Exception到你的方法。您也不需要在catch區塊中添加result = false;

1

我認爲如果feed.fetchContents()方法的任何失敗都無法恢復,那麼處理這個異常的方式非常合適。(主意更好地停止而不是繼續) 除此之外,我建議您使用更具體的異常層次結構。

而另一件事我從有效的Java書得到的是,如果你寫你必須@throw文件(評論)與等原因的方法。