內 容 簡 介本書凝聚作者十余年的思考與實踐,從異常處理的設計與重構入手,介紹了如何提升軟件的健壯性。全書共六部分,從異常處理的現狀談起,逐一條分縷析,闡述異常處理的基本概念、工作機制、異常處理的4+1觀念,介紹軟件健壯度等級和異常處理策略,討論異常處理的壞味道和重構。作者以詼諧幽默的文筆,于談笑間揭示異常處理的來龍去脈,兼顧實用性和趣味性,非常適合善于思考和勤于實踐的軟件工程師閱讀,也適合軟件學院和計算機相關專業學生參考。序言/Preface
這是一本異常處理的書,
也是一本軟件設計的書。
是的,身為一位專業的軟件開發人員,從小到大你可能學過各式各樣的軟件設計技術與方法。從最基礎的程序語言(C、C++、Java、C#、VB.NET、Objective-C、JavaScript、Ruby、Python等)、數據結構與算法,到面向對象分析與設計、設計模式、軟件架構以及各種敏捷開發實踐,包含自動化測試、測試驅動開發、行為驅動開發、持續集成和敏捷設計原則等。以上,所有的“大師”費盡心力,都在告訴你“如何設計軟件的光明面?”
什么?!軟件的光明面?是的,軟件跟宇宙萬物一樣,有光明面也有黑暗面。軟件的光明面就是“正常行為”(normal behavior),而黑暗面則是“異常行為”(abnormal behavior)。就好像一般民眾看到“黑道”與“壞人”,人人莫不避而遠之。大部分的開發人員對于軟件的“黑暗面”與“異常行為”,都感到很頭大,在內心中抱持著“閉上眼睛就以為看不見”的心態:“反正程序看起來可以動就好了”,您說是嗎?
軟件設計包含著正常行為與異常行為,兩者相互影響,忽略任何一方,都可能讓原本精心規劃的設計變得不堪一擊。既然異常行為的設計那么重要,與正常行為相較,為什么很少人談論異常行為?
因為很難。
對付異常行為很難,因為它“躲在正常行為的影子下”,很容易被有意、無意地忽略。其次,它與正常行為“水乳交融”、“我中有你,你中有我”。套一句軟件開發的術語,它是一種“橫切關注點”(cross-cutting concern),需要具備怪醫黑杰克與庖丁解牛的能力,同時關注方方面面,才有可能讓你在對“病人”(程序)進行“外科手術”(處理異常)的時候,避免不小心切斷動脈,導致“失血過多”(越改越亂)而讓病人提早上天堂的窘境。
俗話說“夜路走多了,自然會碰到鬼”,本書累積了Teddy“碰到鬼”的經驗,從異常處理設計出發,專門探討軟件設計黑暗面的問題,希望補足開發人員長久以來所欠缺的“維他命”。
這是一本寫給開發人員的書,
也是一本寫給管理階層的書。
看到書名,你可能會以為這是一本寫給開發人員的書。錯!開發人員的錢要賺,管理階層的錢也要賺。嗯嗯,Teddy的意思是說,異常處理做得好,可以提升軟件的強健度,提高客戶滿意度,幫公司賺大錢,減少程序錯誤,早點下班回家陪家人,并順便護肝。
本書分為6部分42章,有些地方技術含量相對較低,對于不想知道太多異常處理實現細節的管理階層,可以只看這幾個部分。
另外像是Column A“倒霉的人很適合當神秘客”、Column C“網絡又斷”、Column D“這是你的問題,不是我的問題”、Column E“你如何評價成功”、Column G“升級、降級,傻傻分不清楚”、Column I“客戶滿意,老板賺錢,你護肝”,也很適合管理階層當作小說來看。
至于開發人員,當然是要“怒看”整本書的內容才夠“給力”。
是否與程序語言相關
異常處理設計重點不在程序語言和語法,而在背后的設計原理。雖然本書范例以Java語言為主,但也一并討論了許多Java語言和C#語言(支持與不支持checked exception的雙方代表)在異常處理設計精神與作法上的差異。書中所介紹的異常處理設計觀念、名詞、原則、方法與重構,只要是面向對象語言,不管是Java、C#、VB.NET、Python、Ruby等,差不多都適用。
至于采用Java語言作為例子的原因很簡單:因為它是當代流行的商業語言里面,異常處理機制最困難(或是說最“討厭”)的語言。搞懂了Java的異常處理,再應用到其它面向對象語言,就好像喝開水一樣,變得非常容易。
以上用白話文來說就是,不管你使用什么語言,都應該買一本帶回家。
書中用語和排版
以一本中文書而言,書中的英文稍微多了一些。有些英文術語譯成中文之后,閱讀起來總是少了點味道,所以Teddy會選擇性地保留一些英文,例如checked exception和unchecked exception。但英文名詞第一次出現的時候,在它的“前后”或“附近”一定會有相對應的中文翻譯或說明。
為了區分特別的名詞,本書程序代碼采用Courier New字體,而書中提到模式名稱(pattern name)、壞味道(bad smell)、重構(refactoring),則使用大寫開頭的英文斜體字表示。例如Command、Dummy Handler。對于本書中所提出的異常處理重構,除了以斜體字表示以外,還會在名稱之后加上《重構》一書中介紹該重構的章節頁碼,例如Replace Error Code with Exception(299)。
一些軟件領域常用的英文名詞書中直接用中文表示,例如用function與method翻譯成“函數”(有些中文書會使用“函數”或“方法”)。class、object、instance和type用“類”、“對象”、“實例”和“類型”表示。thread、process用“線程”和“進程”稱呼。Application Programming Interface(應用程序編程接口)則直接使用API。
最后,重要的概念和知識點以黑體字加以強調。
***
本書許多內容最初來自于Teddy的博士論文“Java異常處理:模型、重構與模式”(原題目為Java Exception Handling: Models, Refactorings, and Patterns)以及工作上的實踐經驗,經改寫后,從2007年起陸續發表在“搞笑談軟工”博客,最后集結成冊再加上“強烈月光照射”之后,變身成為大家現在看到的這本書。書中內容經過Teddy多次修改與審校,但刻意保留原本在博客中以“鄉民”稱呼讀者的方式。此為特意為之,并非Teddy偷懶,特此說明。
鄉民們若對本書內容有任何問題、心得、稱贊,或者發現錯誤,或是看到不爽想翻桌的時候,歡迎直接寫信到teddy.chen.tw@gmail.com給Teddy或加入Facebook上的“搞笑談軟工社團”,網址為https://www. facebook.com/groups/teddy.tw/,我們一起討論。
目錄/Contents
Part 1 異常處理的現狀
Chapter 01 你對異常處理的了解有多少? 3
02 異常處理的重要性 6
03 “種花”電信,我真是猜不透你啊! 14
04 HTC One X—— 發現一個Bug 21
05 HTC One X—— 我只是想打通電話呀! 25
06 HTC One X—— 拍照的錯誤消息描述 30
07 可靠性可以是一門生意 35
Column A. 倒霉的人很適合當神秘客 39
Part 2 異常處理的基本觀念
Chapter 08 強健性大戰首部曲—— 魅影危機 47
Column B. 找不到數據,要傳回Null還是丟出異常? 54
09 異常處理的四種脈絡 57
10 面向對象語言的異常處理機制 69
11 你的汽車有多耐撞?談談異常安全性 86
12 對比異常處理和容錯設計 90
Column C. 網絡又斷了 95
Part 3 JAVA語言的異常處理機制
Chapter 13 Java的異常處理 101
14 我的異常被finally塊覆蓋了 110
15 被打壓的異常—— 搶救異常大作戰 116
16 清理失效的語義要表達清楚 122
17 自己制作“被打壓的異常” 131
18 Try、Catch和Finally的責任分擔 144
Column D. 這是你的問題,不是我的問題 152
Chapter 19 異常處理失敗,怎么辦? 156
20 已查異常與未查異常的語義與問題 159
21 接口演進 164
Part 4 為什么異常處理那么難?異常處理的4+1觀點
Chapter 22 用途觀點 173
23 設計觀點 177
24 處理觀點 181
25 工具支持觀點 185
26 流程觀點 191
Column E. 你如何評價成功 198
Part 5 強健度等級與異常處理策略
Chapter 27 異常處理設計的第一步—— 決定強健度等級 203
28 強健度等級1—— 錯誤報告的實現策略 211
29 強健度等級2—— 狀態恢復的實現策略 216
30 強健度等級3—— 行為恢復的實現策略 223
Column F. VMWare越獄之替代方案 231
Chapter 31 異常類的設計與使用技巧 235
32 終止或繼續 245
33 自動化更新 249
Column G. 升級、降級,傻傻分不清楚 253
Part 6 異常處理壞味道與重構
Chapter 34 異常處理壞味道 261
Column H. 仙人打鼓有時錯—— 談談Clean Code一書中介紹的異常處理 269
Chapter 35 用異常代替錯誤碼 275
36 以未查異常取代忽略已查異常 281
37 以重新丟出異常代替空的處理程序 285
38 使用最外層Try語句避免意外終止 290
39 以函數取代嵌套的Try語句 295
40 引入Checkpoint類 301
41 引入多才多藝的Try塊 309
Column I. 客戶滿意,老板賺錢,你護肝 317
Chapter 42 一個函數只能有一個Try語句 326
Column J. 眼力測試 332
Appendix A.眼力測試參考答案 340
參考文獻 349