Jan. 30 14:47~16:27
Teddy前幾天用HTC One X照相的時候,出現了類似「SD卡存取錯誤」的訊息。詳細錯誤敘述Teddy已經忘記了,當然也沒辦法把手機畫面抓下來…因為…SD卡存取錯誤,沒辦法把畫面存起來啊…Orz。
看到這個訊息之後Teddy心想:「耶,手機買不到一年,怎麼這麼快SD卡就壞掉了?!」。江湖上不是傳言說:「HTC品質,堅若磐石」嗎…啊,不對,這是另外一家公司的口號XD。可能是PC用太久了,Teddy想說把手機重新開機看看問題會不會自動消失。重開之後再試一次拍照功能,還是一樣出現同樣的錯誤訊息。李組長眉頭一皺,發現案情並不單純 後來Teddy觀察到,拍照時照片好像都有拍成功,但是最後卻沒有被存起來。於是Teddy猜想,會不會是SD卡的空間已滿?刪掉幾張舊照片之後,果然錯誤訊息不見了,照片也可能成功的被存下來。
***
看完上面這個故事不知道鄉民們心中是否有著跟Teddy一樣疑問:為什麼HTC One X的拍照軟體不直接告訴使用者:「SD卡空間已滿,若要繼續拍照請先清除SD卡空間」,而是顯示「SD卡存取錯誤」這種很容易讓人誤會的訊息?之前Teddy寫過一篇《HTC One X之發現一個bug》也是遇到類似例外處理與錯誤訊息顯示的問題。本篇提到的「SD卡存取錯誤」這個錯誤訊息,Teddy在「公堂之上大膽假設一下」,可能是因為拍照軟體將捕捉到的例外直接顯示出來,請參考下圖:
在SD卡已滿的情況下,拍照軟體還要存入照片,於是手機硬體發出「SD卡存取錯誤」的例外E1,而拍照軟體可能有著類似下圖的例外處理程式:
因為採用「generic catch」的方式來捕捉例外,因此最簡單的處理方式就是把捕捉到的例外直接顯顯示在畫面上。
***
問題出在哪裡
接下來眼尖一點的鄉民們可能會問:前面這段程式這樣寫並沒有錯啊,錯的是Android作業系統,為什麼不針對SD空間不足傳回一個「NotEnoughSDSpaceException」,而卻傳回「SDAccessErrorException」這種這麼一般性的例外?
沒錯,如果作業系統或是底層的API可以直接針對SD卡的操作傳回非常詳細的例外類別,API的使用者就比較輕鬆,也許直接把錯誤訊息顯示在畫面上就可以了。但是由於存取SD卡的錯誤原因很多,如果要針對每一個原因都設計一個例外類別,系統中便會有太多的例外類別(exception class的種類太多也是一個問題,例如需要更多的記憶體空間來存放這些例外)。像是JDK,IOException底下的子類別,也只有一個FileNotFoundException和檔案處理比較有關,其餘的檔案操作例外,大多直接使用都用IOException來表示。
怎麼辦
身為一位繁忙的程式設計師,正常功能都快沒時間寫了,哪有時間去管例外處理的問題。所以鄉民們當然可以正大光明地選擇維持現狀。如果真的要做到Teddy心中期待的錯誤處理方式(至少要顯示類似「SD卡空間已滿,若要繼續拍照請先清除SD卡空間」這種對使用者而言比較有意義的訊息),程式可能要改成:
***
很多時候,使用者認為的bug,不一定真的是程式邏輯的錯誤,可能只是因為使用者不清楚程式內部運作的context或是precondition。例如,雖然大家都知道要拍照一定要有足夠的儲存空間,否則拍完之後無法存檔,但使用者在拍照的時候並不一定會隨時注意到儲存空間是否足夠。在這種情況之下,如果程式可以從使用者的使用情境來思考,當錯誤發生時儘量顯示對於使用者有意義的訊息,那麼聰明的人類是很有可能可以自行排除大部分的問題滴。
***
友藏內心獨白:以上程式結構純屬紙上談兵。