天天看點

編寫高品質代碼改善java程式的151個建議——[110-117]異常及Web項目中異常處理何為異常處理?提倡異常封裝采用異常鍊傳遞異常受檢異常盡可能轉化為非受檢異常 多使用異常,把性能問題放一邊java web 中的異常處理

異常處理,英文名為exceptional handling, 是代替日漸衰落的error code方法的新法,提供error code

所未能具體的優勢。異常處理分離了接收和處理錯誤代碼。這個功能理清了程式設計者的思緒,也幫助代碼增強了可讀性,友善了維護者的閱讀和了解。

java語言中,異常處理可以確定程式的健壯性,提高系統的可用率.但是java api 提供的異常都是比較低級的,是以有了'提倡異常封裝’

編寫高品質代碼改善java程式的151個建議——[110-117]異常及Web項目中異常處理何為異常處理?提倡異常封裝采用異常鍊傳遞異常受檢異常盡可能轉化為非受檢異常 多使用異常,把性能問題放一邊java web 中的異常處理

異常封裝有三個優點:  1)提高系統的友好性   2)提高性能的可維護性   3)解決java異常機制自身的缺陷

提高系統的友好性

系統的友好性,就像系統和開發人員等握手與交流.好的系統對象,會展現出交流時候所需要的一切.是以,良好的友好性需要良好的代碼告訴開發人員和使用者.開發人員要找需要列印出堆棧資訊.

show the code:

::throw new mybussinessexception(e);

在這裡,無效檔案導緻了兩點:檔案未找到和該業務出現問題.是以,在檔案未找到之後我們可以繼續根據需要告之其他異常.

提高性能的可維護性

如何提搞可維護性,大家不能一味的進行這樣操作,就抛出exception,這樣會導緻别人看你的代碼完全check不到異常點.下面的代碼是不可取的:

正确的做法是對異常進行分類處理,并進行封裝輸出.

catch{}

這樣子,直接在代碼層級上分析即可,代碼異常在哪裡抛出.維護人員看到這樣的異常也會有了準确的判斷.

解決java異常機制自身的缺陷

先抛出個問題:例如注冊時,要對很多進行檢驗.像密碼,使用者名,郵箱…...這樣情況下,我們必須要在一個注冊方法裡面抛出很多個異常.是以,正确的方法是封裝異常,建立異常容器,一次性對某對象進行校驗,然後傳回所有異常.

show the code

異常容器:

處理異常:

我們做的jee項目時候,一般會有三層的結構:持久層,邏輯層,展現層.異常也是如此的,當我們各個層之間傳遞異常,我們就需要先封裝,然後傳遞.簡要的就是采用異常傳遞異常:

[摘自源碼分析]

從中我們可以抽取的看到:

jdbc執行sql語句查詢的時候,先抛出sqlexception ,然後就像一條鍊一樣,下一步告訴别人是jdbc的異常.下面體會經典,休息下:

所有受檢異常(checked exception)是好事,為何要盡可能轉化為非,也就是(unchecked exception)呢?我的了解是:受檢異常威脅到系統的安全性,穩定性,可靠性,正确性時,不能轉換為非受檢異常.

也就是說,其中存在的受檢異常有缺點,轉換成unchecked exception就輕松解決了.

受檢異常使接口聲明脆弱

throws mysecurityexception;

這裡面不一定隻是一個異常,然而定義了異常,會增加了接口的不穩定性,這就存在了面向對象設計的嚴重亵渎,如果要改變的話,又破壞了封裝性.

另外,受檢異常還有兩個缺點:

受檢異常使代碼可讀性降低

受檢異常增加了開發工作量

“性能問題不是拒絕異常的借口” 就當一個常見的登入用例.我們經常會添加一個例外的事件:”連續登入3次登入失敗,暫時鎖定使用者帳号.”這樣這個例外的事件就是一個異常處理.

這樣子一來,代碼邏輯很清晰.但是這樣子就抛出了一個主意.這樣子有代價:

性能比較慢

java的異常處理機制确實比較慢,這個性能慢是相對的.相對那些基礎類型:string integer…等.有人測試結果如下:

相當于建立每個異常對象是普通對象的五倍.但是數量級上是 ms,在一個系統中,如此微小的性能消耗是可以允許的.

經驗之談:”用對了地方就好,用錯了地方就不好。”這是我的師傅跟我說的,他教會了很多.太很抽象,我想我會慢慢學會的.

實際j2ee項目中,通常一個頁面請求到達背景以後,首先是到mvc中的controller,在controller層會調用業務邏輯層

service,而在service層會調用持久層dao進而獲得資料,再将獲得的資料一層一層傳回到controller層,然後通過

controller控制層轉發到指定頁面.

可能存在的異常:

dao層可能會發生sqlexception異常

service層可能會發生nullpointexception異常,

controller層可能會發生ioexception異常,runtimeexception異常

正确的處理方式

根據上面知識的說法:我們該用以下的方法來實作

<a href="http://www.cnblogs.com/alandre/p/3794513.html#jeffli_h2">提倡異常封裝</a>

throw new entityexception("error! when save the entity",e);

這裡用了鍊式異常抛出:entityexception是自定義的異常類:

自然還有些什麼攔截器抛出異常,在這裡就不詳細展開讨論了.