2013-02-07 156 views
0

我有關於異常處理程序的問題。 我有一個結構化的代碼,用於我的項目,它有許多用於不同目的的包和類。 在這段代碼中,有很多地方我試圖捕捉不同類型的異常。 其中有幾個是SAXException,IOException,NumberFormatException, ParserConfigurationException,RuntimeException等。Java全局異常處理程序

在我發現異常的所有情況下,我只打印堆棧跟蹤。當我遇到一個異常時,我會從堆棧中找出它發生的地方並相應地修復它。除了例外情況,我不會做任何其他事情,因爲代碼的大小並不是很大,而且相當容易爲我調試。

現在,我正在使用由第三方開發人員提供的外部Java庫。這個庫爲我調用的每個可能的函數都拋出異常。我正在試圖在這個庫上寫一個封裝器來利用它。不過,由於這個庫,我發現try/catch塊在我的代碼中無處不在。

例如我的代碼看起來是這樣的 -

Class Wrapper 
{ 
    public void method1() 
    { 
     .... 
     try 
     { 
      ... 
      third party library calls... 
      ... 
     } catch (Exception e) { e.printStackTrace(); } 

    } 

    public void method2() 
    { 
     .... 
     try 
     { 
      ... 
      third party library calls... 
      ... 
     } catch (Exception e) { e.printStackTrace(); } 

    } 
    // ... and so on... there are 50-100 methods like this. 
    // some are even one-liners. 
} 

鑑於這種情況,我應該切換到全局異常處理程序,this discussion提到?

這是否會避免在我的代碼中編寫try/catch塊?

另外,我應該刪除現有的try/catch塊嗎?

謝謝!

+0

使用寵物小精靈的錯誤處理 - 一網打盡!試一試/抓住所有代碼。 –

+3

你必須處理檢查過的異常,不要繞過。通過打印堆棧跟蹤來吞噬異常是一種反模式,您應該真的在處理它們或重新拋出一個更高級別的類來處理。 – Perception

回答

1

如果你不想讓你的客戶端代碼處理檢查的異常,你可以在你的包裝器中做如下的事情。

public void method1() { 
    try { 
     //3rd party code here.... 
    } 
    catch(RuntimeException e){ 
     throw e; 
    } 
    catch(Exception e){ 
     throw new RuntimeException(e.getMessage(),e); 
    } 
} 

通知,這樣就避免了吞通過第三方庫拋出的異常,並不會強制客戶辦理託運例外像IOExceptionSQLException

+0

感謝您的回答。然而我的問題是,我實現可以說200個方法是封裝在這個第三方庫。每種方法都有try/catch塊。我想知道是否有辦法避免它。 – Raj

+0

@Raj是否屬於單一類?你可以考慮使用'Reflection'來調用它們。像Eclipse這樣的一些IDE爲方法委派提供自動代碼生成。你也可以使用它。 –

1

如果你不介意你的程序在任何異常之後退出,你可以使用全局異常處理程序。你可能必須把throws Exception(或一個更具體的異常類)放在大量的地方(以防止未處理的異常編譯時錯誤),這是非常不理想的(並且最終可能會比「漂亮」的代碼更少在拋出異常的地方捕獲)。另一方面,如果您希望程序從錯誤中恢復(這通常是生產級代碼中需要的),那麼您需要適當放置try-catch語句(這可能涉及具有try-catch語句無處不在你的代碼中)。例如,如果發生IOException,則可能需要重試,或者如果發生NumberFormatException,則可能要通知用戶輸入無效,並讓他/她再次嘗試。

你不應該只是刪除try-catch語句,你應該看看他們做了什麼,這種行爲是否是你想要的以及它是否可以用其他解決方案(例如全球try-catch語句)重現。

+0

如果發生異常,我可能無法進一步處理?我構建了一個通過XML輸入並以文件形式輸出的編譯和仿真工具。沒有任何與用戶的交互。因此,如果輸入文件中有錯誤,則編譯無法繼續進行。 – Raj

+1

@Raj然後,你可能不得不在你的函數中加入一堆'throws'語句,或者至少捕獲最少量的異常(無論哪種異常都會導致未處理的異常編譯時錯誤)。 – Dukeling