java中的異常的捕獲與拋出原則

在可能會出現exception的地方,要使用try-catch或者throws或者二者都要。個人判斷依據是:若是對可能出現的exception不 想被外部(方法的調用者)知道,就在方法內部try-catch掉這個exception;若是但願外部知道,則在catch到以後把exception 直接拋出或者拋出自定義的exception。  
1、異常的種類  
java異常能夠分紅兩大類:Exception和RuntimeException(雖然RuntimeException是從 Exception繼承的)。exception異常表明「沒法避免的異常」 如io異常   每每這類異常是因爲外部緣由形成的,程序自己沒法保證他們不發生,因此這類異常必須捕獲。若是在函數內部沒法處理這個異常必須再次拋出(在函數後面用 throws語句),若是什麼都不作就出現編譯錯誤。
runtimexception是指「能夠避免的異常」,如 null引用異常,這類異常都是由程序內部緣由形成的,是能夠避免的。對於這類異常能夠忽略他們,但一旦發生程序就會異常終止。這類異常對debug很是有幫助,固然,若是須要也能夠catch。

另外,有些地方即便不會有exception,可是從商業邏輯上是錯誤的、非預期的,也能夠拋出user exception。例如,用戶輸入非法,bank account非法透支等等。

2、主要原則  
處理意外的一個重要原則,就是要麼處理,要麼接着拋,決不能吃掉(You either handle it, or throw it. You don’t eat it.)這就是說,當你捕獲一個異常以後,必須決定是否當即處理這個異常,或者繼續拋出這個異常(或者另外一個自定義異常),以便由調用的客戶端捕獲之。當 客戶端捕獲到之後,又會繼續進行相似的判斷。

通常來講,GUI端是要處理異常的,好比JSP捕獲到異常以後,須要先是給用戶一個友好的出錯信息,而不要給出系統的出錯信息。系統的出錯信息一方面不太友好,另外一方面提供了太多的系統信息,容易被惡意用戶用來攻擊系統。

換句話說,全部的異常最終必須有一個終極的處理者,這就是GUI。至於中間的環節,好比在服務器端運行的JavaBean是否要處理捕獲到的異常,仍是繼續拋出所捕獲的異常,須要視具體狀況處理。  

除非你想把異常處理的責任交給調用者,通常不用throws。 好比你要讀入一些文件,若是你想通知調用者,讓調用者決定如何處理這個異常,你就把這個異常throws給調用者;若是你知道應該如何處理這個異常,或者你想把異常立刻解決,你能夠就地catch她。

這徹底取決於你想把異常本身當即處理仍是想把處理責任返回給調用者。取決於你的程序的結構和要求。  
須要注意的有:
一、若是沒法處理某個異常,那就不要捕獲它。  
二、若是捕獲了一個異常,請不要胡亂處理它。  
三、儘可能在靠近異常被拋出的地方捕獲異常。  
四、在捕獲異常的地方將它記錄到日誌中,除非您打算將它從新拋出。  
五、按照您的異常處理必須多精細來構造您的方法。  
六、須要用幾種類型的異常就用幾種,尤爲是對於應用程序異常。  

3、異常嵌套和捕獲適當的異常

按照Java語言的定義,所謂異常(Exception)指的就是向調用方法(calling method)表示發生非正常狀況的習慣方式。下面討論兩種在處理異常時可茲利用的技術:異常嵌套和捕獲適當的異常。

異常嵌套  
你在試圖捕獲異常並打算扔出異常時該採起什麼措施呢?同時,你但願原始的異常信息可用嗎?  

要回答以上的問題你不妨嘗試一下NestedException類。具體的編程並不難,惟一要作的無非是利用構造器而且重載printStackTrace()以便顯示出正確的數據。

此外,你還應當考慮封裝Throwable而非Exception類來建立更具備重用性的組件。以後,你能夠建立NestedRuntimeException變量封裝Throwable但無需對其進行聲明。

捕獲適當的異常
正確地處理異常並非一項輕鬆的任務,這是由於異常的處理有時會致使程序出現其餘不明行爲。不過,如下三條規則能夠幫助你避免錯誤處理異常所可能遭遇的風險。

規則 #1: 老是捕獲扔出異常的類型而不要理睬異常的超類。 爲了遵照一般的代碼習慣,你能夠採用Exception類的大寫字母做爲變量名,以下所示:  
    catch(FileNotFoundException fnfe)  
以及
    catch(SQLException sqle)

規則 # 2: 決不讓catch塊留空。在不少狀況下雖然確實編寫了try/catch塊但在代碼的catch部分卻什麼都沒有作。或者,若是採用了日誌API(Logging API),那麼請編寫代碼把異常寫到日誌中。

規則 # 3: 決不扔出Exception基類的實例。開發人員應當老是扔出本身建立的異常類。

扔出異常的API很難處理。在聲明方法扔出java.lang.Exception的狀況下,全部的問題都會強加在API用戶的頭上,這樣他們就 沒法以一種專業的編程方式來處理異常。經過爲扔出API聲明Exception類的子類這一舉措,API開發人員就能夠減輕用戶的負擔。

以上提到的兩種技術在處理異常時還可能用得更好、更適當。嵌套技術令異常扔到另外一異常的內部,而捕獲適當的異常令程序調試大大簡化。java

相關文章
相關標籤/搜索