今天的問題是關于異常,自然,今天的主角是異常之神。
我問:大神,異常到底是個什么東西哩?什么情況下我們需要拋出異常呢?
果然是異常之神,很異常,反問:如果老婆叫你去超市買蝦,蝦剛好賣光了,你會怎么辦?
我想都沒想,說:給老婆打電話哈!
神仙說:這就是異常!
我說:不能完成買蝦這個任務?
神仙說:不在你控制范圍內的因素所造成的問題、沒有預料到的情況就叫異常。在上面這個例子里,由于你沒法控制超市是否還有蝦,所以當你面臨這個問題而又無法自己解決時就會拋出這個異常。
我說:哦,異常有兩個特點,一個是造成不能正常執行任務的因素不在我的控制范圍,二是我自己沒有足夠的信息進行處理,只能拋出。
我問:我知道JAVA里異常有checked和runtime之分,用哪個好呢?
神仙說:繼續前面的問題,你和老婆打了電話,結果發現是女兒要吃蝦,這時會怎么辦呢?
我說:老婆會讓我等等,然后去問我女兒,然后再回答我,女兒說了,可以吃魚。
神仙說:實際處理這個問題的是你女兒?
我說:是的。
神仙說:那為什么你不直接讓你女兒接電話哩?
我說:因為女兒管她媽媽,她媽媽管我。
神仙說:如果是checked異常,那么盡管媽媽不能處理這個問題,她還是需要處理;如果是runtime,那么媽媽就不用操心啦。
我說:我明白了,checked異常強制我們在發生異常的地方進行處理,哪怕實際我并不能處理,只會產生一坨一坨的try catch,runtime能夠讓我們在能夠處理異常的地方才捕獲這個異常。
神仙說:異常處理有一項很重要的目標,就是將處理異常的代碼從異常發生的地方移開。這樣就能在一個地方集中精力去解決你想解決的問題,然后再到另一地方去處理這些異常問題。程序的主線就不會被異常處理這類枝節問題給搞得支離破碎,程序也更易于理解和維護。
我說,所以都用runtime異常,第三方的checked異常如果不能立即處理,那么也應該轉為runtime。
神仙說,異常處理的一個重要準則是:如果你不知道該如何處理這個異常,那么你就別去捕捉它。
我說,太好了,checked異常必須處理,runtime異常不用處理!
神仙說,你會直接在用戶界面打印出一坨坨黑白相間的美妙異常棧?
我說,當然不會,我會統一跳轉到一個出錯頁面。
神仙說,難道這不是對異常的處理嗎?
我說,恩,也是。
神仙說,所有異常必須處理!在程序里可以拋異常,但是決不能把異常拋給最終用戶。BUG在程序員手里還不是BUG,但是一旦交付,那么就是BUG。
我問:出現異常的地方我直接new RuntimeException()可以嗎?反正最后是告訴老婆買不成蝦。
神仙說,如果你女兒問為什么沒買到蝦怎么辦?
我說,我會告訴她蝦賣完了。
神仙說,信息在哪兒呢?
我說,我明白了,扔出異常一定要加上異常信息。
神仙說,非常重要!對于最終用戶可能僅僅是個出錯頁面,但是對于需要解決這個問題的程序員來說,異常信息就非常重要了。
我說,所以如果是自定義異常,那么一定要加異常信息;如果是checked異常轉runtime則一定要保存原有的異常,形成異常棧。
我問:好吧,我看到很多程序都自定義異常。
神仙說,如果是通貨膨脹錢沒帶夠而買不了蝦怎么辦?
我說,我會回家取錢。
神仙說,那么如果是蝦沒了呢?
我說,那買個鬼,賣魚羅。
神仙說,所以需要自定義異常,這樣可以產生不同的異常處理策略。
我說,如果需要對不同的異常進行不同的處理,那么就需要自定義異常。
神仙說,自定義異常需要有自己的繼承體系,這樣當我不想單個處理時,可以對一種類型的異常采用統一的一種處理,例如spring的DataAccessException。
我暗喜:正在寫工作流異常模式哩,何不一起問一下?哈哈。
神仙說:未完待續,敬請期待工作流異常的問與答。
http://www.aygfsteel.com/ronghao 榮浩原創,轉載請注明出處:)
FeedBack:
# re: 關于異常的問與答
只有注冊用戶登錄后才能發表評論。 | ||
![]() |
||
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
|
||
相關文章:
|
||
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
29 | 30 | 31 | 1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 | |||
12 | 13 | 14 | 15 | 16 | 17 | 18 | |||
19 | 20 | 21 | 22 | 23 | 24 | 25 | |||
26 | 27 | 28 | 29 | 30 | 1 | 2 | |||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
關注工作流和企業業務流程改進。現就職于ThoughtWorks。新浪微博:http://weibo.com/ronghao100
常用鏈接
留言簿(38)
隨筆分類
- ajax相關(9)
- cms(7)
- Head First Process-深入淺出流程(15)
- j2se基礎(6)
- JbpmSide(6)
- OOA/OOD(4)
- SOA、BPM(26)
- 工作日志(24)
- 工作流jbpm3(10)
- 張小慶,在路上(42)
- 心情小站(24)
- 權限相關(12)
- 表現層相關(4)
- 轉載(4)
隨筆檔案
- 2013年8月 (1)
- 2012年12月 (1)
- 2012年1月 (3)
- 2011年12月 (2)
- 2011年11月 (2)
- 2011年10月 (3)
- 2011年9月 (3)
- 2011年8月 (7)
- 2011年7月 (4)
- 2011年6月 (3)
- 2011年5月 (5)
- 2011年4月 (6)
- 2011年3月 (4)
- 2011年2月 (2)
- 2010年9月 (1)
- 2010年6月 (1)
- 2010年5月 (1)
- 2010年3月 (4)
- 2010年1月 (2)
- 2009年11月 (5)
- 2009年10月 (4)
- 2009年9月 (1)
- 2009年7月 (1)
- 2009年6月 (2)
- 2009年5月 (2)
- 2009年4月 (1)
- 2009年3月 (4)
- 2009年2月 (2)
- 2008年12月 (1)
- 2008年11月 (1)
- 2008年10月 (1)
- 2008年9月 (2)
- 2008年8月 (2)
- 2008年7月 (2)
- 2008年6月 (3)
- 2008年5月 (4)
- 2008年4月 (1)
- 2008年3月 (2)
- 2008年2月 (2)
- 2008年1月 (4)
- 2007年11月 (3)
- 2007年10月 (3)
- 2007年9月 (2)
- 2007年8月 (4)
- 2007年7月 (1)
- 2007年6月 (12)
- 2007年5月 (2)
- 2007年4月 (1)
- 2007年3月 (8)
- 2007年2月 (6)
- 2007年1月 (4)
- 2006年12月 (4)
- 2006年11月 (3)
- 2006年10月 (1)
- 2006年8月 (2)
- 2006年7月 (3)
- 2006年6月 (3)
- 2006年4月 (1)
- 2006年3月 (2)
- 2006年2月 (2)
- 2006年1月 (4)
- 2005年12月 (7)
- 2005年11月 (12)
文章分類
文章檔案
常去的網站
搜索
最新評論

- 1.?re: 使用Handler來增強Web服務的功能
- asdfasfd
- --ads
- 2.?re: 使用solr搭建你的全文檢索
-
@木哥哥
你的分詞器用的是什么啊?mmseg貌似可以的 - --陳冠馳
- 3.?re: 使用solr搭建你的全文檢索
-
@marten這是你的solr的schame.xml配置文件有問題。好好檢查下你的配置文件里面的字段什么的配置對著沒
- --陳冠馳
- 4.?re: 討論一下你覺得一個工作流產品好的標準
- 評論內容較長,點擊標題查看
- --深圳非凡信息技術有限公司
- 5.?re: DisplayTag應用
- name="test"從哪里來的,千篇一律的到處使用test卻沒有test的定義,sb
- --qige