2021-10-13 16:45

初學 Exception 的疑問

一開始學習 Exception 一定會有很多疑問,或者根本沒搞清楚就寫了一堆 try catch,讓程式邏輯變得亂七八糟難以閱讀,甚至小小的修改都不知道從何下手,Exception 是一種邏輯的輔助工具,可以讓你事半功倍,也可以變成噩夢。

我也是摸索了很久才對 Exception 有一定的應用認識,不敢說有多專精,畢竟每種語言跟特性都不同,但也是一定程度的應用經驗,我認為最重要的用途有兩個:


* 用 finally 去關閉資源物件

資源物件有 File, Socket,...,這類的物件在邏輯結束後一定要進行關閉,強調一定一定,實在是吃了自己埋的雷了,沒有關閉的話資源會被咬住,像 Serial Port 這種底層資源沒有關閉的話,想要重新連接就只能重開機了,這是讓人無法接受的。

  1. FileStream file1 = null; 
  2. try 
  3. { 
  4.    file1 = File.Open("<file path>", FileMode.OpenOrCreate); 
  5.    // Do something 
  6. } 
  7. finally 
  8. { 
  9.    if (file1 != null) { file1.Close(); } 
  10. } 
  11.  
  12. /*== C# 可以用 using 代替上面的程式 ==*/ 
  13. using (FileStream file2 = File.Open("<file path>", FileMode.OpenOrCreate)) 
  14. { 
  15.    // Do something 
  16. } 


* 用 catch 去記錄 Exception

為了日後可以在日後除錯時留下線索,Exception 的記錄是很重要的,任何程式都有可能出現錯誤,不管是資料錯誤還是邏輯錯誤,有除錯的線索肯定會有很大的幫助,無論程式的大小都應該留下錯誤紀錄。

  1. try 
  2. { 
  3.    // Do something 
  4. } 
  5. catch (Expression ex) 
  6. { 
  7.    _log.Error(ex, "An error occurred."); 
  8. } 

其餘的清況,在不知道為何要用 try catch 時,最好就不要寫 try catch,基本上程式邏輯一旦出錯就只能退出,如果胡亂地進行修正讓邏輯繼續下去,可能會出現很糟糕的局面,而且資料錯誤就應該修正資料,邏輯錯誤就應該修正邏輯。

錯誤就是要讓人發現才有辦法修正,胡亂的將錯誤屏蔽掉只會埋下未來的苦果,也別用這種方式報復前東家,這只會搞到後面接手的倒楣鬼,本是同根生,相煎何太急。

0 回應: