l

2014年3月6日 星期四

神人降世!我怎麼就沒想過可以這樣子使用例外哩

Feb. 25 21:20~21:50

image

 

今天在Facebook上看到一位朋友提到有人犯了「用例外處理取代控制流程(control flow)」的錯誤。有人把一個用來將性別由「男」或「女」轉成數字的函數checkSex()寫成下面這個樣子:

public void checkSex() throws Exception

   if (sex == “男”) {

        throw new MaleException();

   } else if (sex == “女”) {

        throw new FemaleException();

}

 

checkSex()沒有宣告傳回值,反倒是丟出了例外,用MaleException代表「男」,用FemaleException代表「女」。呼叫checkSex()的函數updateDatabase()大概長成下面這樣子:

public void updateDatabase(){

     int sex;

      try {

        checkSex();

      } catch(MaleException e){

           sex = 0;

      } catch(FemaleException e ) {

           sex = 1;

      }

      …

}

***

以上程式可以通過測試案例,執行結果完全正確。但是,家裡面出了這種code,鄉民們您吞得下去嗎?Teddy真的是孤陋寡聞,可以把例外處理「玩」成這樣,而且還不是學生,而是「業界人士」所寫出的程式碼(疑,會不會是業界人士把案子外包給學生開發出來的程式?!),還真是第一次遇到。

checkSex()至少犯了兩個例外處理的基本錯誤:

  • 用例外處理取代控制流程(control flow)
  • 用例外取代回傳值

這種錯誤是如此的顯而易見,以至於Teddy在寫《笑談軟體工程:例外處理設計的逆襲》這本書的時候根本就沒擺進去,沒想到還真的有人寫出這樣的程式。書還沒出版,難道要多寫一章…挑眉質疑

***

友藏內心獨白:怎麼搞得好像只要不是文盲都可以來寫程式的說嚎啕大哭

7 則留言:

  1. 其實這位工程師只是為了抒發他心中的不滿而已,每天都寫一樣的code,太無聊了,放些怪怪的code進去整整公司..... :P

    回覆刪除
  2. 早上收到YA先生寄來的一封信,他說有一個叫做Play 的Framework,還真的把 exception 當成 flow control,請參考:http://stackoverflow.com/questions/8500739/why-play-framework-simply-throw-a-new-render-in-controller-class。這個問題還蠻有趣的,真的有人認為可以把 exception handling 當做 control flow 來用,我找時間再來談一下這個議題(等我自己弄懂之後 XD)。

    回覆刪除
  3. 酷 ~ 書哪時要出阿

    回覆刪除
  4. 蠻好奇對於該 play framework 使用例外控制流程的原因......

    回覆刪除