Skip to content

Instantly share code, notes, and snippets.

@b26168
Last active December 22, 2016 09:06
Show Gist options
  • Save b26168/08c6e303f40c086a3172db653379d339 to your computer and use it in GitHub Desktop.
Save b26168/08c6e303f40c086a3172db653379d339 to your computer and use it in GitHub Desktop.
網路上查了一些關於 exception 的資料
首先 在看 Exception 之前
先了解這些名詞 Fault、Error、Failure、Exception
[Fault、Error、Failure、Exception] http://teddy-chen-tw.blogspot.tw/2013/02/faulterrorfailureexception.html
在支援Exception(例外)概念的程式語言中(例如Java、C#),則是使用exception來表示error與failure。
而當中提到了 Error 與 Failure 的關係,是因為造成 Error 後不可回復性所產生的 Failure
這件事情在下面這篇提到了以不同的觀點來看 Exception
[搞定例外處理要先知道的5件事] http://www.ithome.com.tw/tech/96726
這裡以 用途觀點、設計觀點、處理觀點、工具支援觀點、流程觀點 來解釋Exception
設計觀點 : 假設設計人員在設計的時候 就已經知道會拋出甚麼例外 (C#不知道有沒有這個設計)
用途觀點 : 例外還有可能被用來當做resultclassification(結果分類)與monitoring(監控)
處理觀點 : 1. 可回復性(recoverability):針對例外所造成的錯誤狀態,捕捉例外的人是否有能力可以將其回復(recoverable)或是沒有能力回復(unrecoverable,又稱為irrecoverable)。2. 例外處理實作:有哪些例外處理策略可以使用?例如,是否需要將例外往外傳遞、如何執行狀態恢復動作、如何確保函數在例外發生時能夠繼續提供服務?在所選擇的程式語言中,要如何實作這些策略?
工具支援觀點 : 為了提高軟體的強健度,開發人員需要一個提醒機制,告知哪些操作有可能產生例外,否則,開發人員很容易便會忽略例外處理,只能等程式執行期間發生錯誤再回頭修補
流程觀點 : (這篇文沒有提到 不過在另一篇有提到該網友自己的觀點 [驗證Exceptions] https://read01.com/3QNeBg.html)
關於上面提到的 工具支援 以及 流程 觀點
工具支援的部分 Java 所提供的 check exception 以及 uncheck exception 機制,在C#並沒有提供 check exception
[The Trouble with Checked Exceptions] http://www.artima.com/intv/handcuffs.html 這裡提到了為什麼不加入 check exception
而在這篇提到
[Re: [疑惑] C++ Exception] https://www.ptt.cc/man/C_and_CPP/D8D2/DA94/DDBB/M.1127480790.A.78A.html
C++ exception 的基本觀念是「讓有能力處理異常的模組去處理」
所以並非只是拋出 exception 就沒事了,根據處理觀點,必須能夠對 error 做例外處理
這篇提到C++ exception 的優缺點
[Re: [問題] 例外處理] https://www.ptt.cc/bbs/C_and_CPP/M.1243743989.A.AE6.html
%以下為節錄
%
Exception 最重要的優點在於你可以分離「正常程序」與「錯誤處理程序」,讓你的程式碼變得清楚易懂。
當你的函式不知道怎麼處理錯誤,就不需要寫錯誤處理的程式碼,exception 發生時,會把控制權一層層往上傳遞,直到它被抓住 (catch) 為止。
因為 C++ 沒有 GC,因此使用 exception 容易產生 memory leak 的問題,其實 exception 可能造成的危害不只如此,因為會遺失的「資源」並不只有記憶體。比如說已建立的網路連線、mutex、檔案寫入鎖定等等,都可能因為exception 的發生,而導致這些資源持續被占用。GC 只管記憶體,因此無法釋放這類資源。Java 有 GC,也大量使用 exception 作為錯誤處理,同樣也會發生這類資源遺失的問題。
exception 主要有兩項缺點:
1. 效率不佳。這邊的效率不僅僅是「compiler 為了這個功能而幫你產生額外的程式碼」,還包含「你為了達成 exception safety 而犧牲的效能」。在Exceptional C++ 一書中提到,若你的 class 包含其它物件,而你想寫一個
exception safe copy assignment,多半必須依賴「產生暫時物件」加上「nothrow swapping」的手法來達成。然而「產生暫時物件」顯然會犧牲效率,nothrow swapping 則要求所包含的其它物件配置在 heap,同樣也是犧牲效率。
丟出 exception 讓上層函式接受,是一件很花時間的動作,因為 compiler 多半假設 exception 並不常發生,自然也不太會在這方面尋求最佳化。
2. Exception 需要在軟體設計之初就被納入設計考量內,這也是 Google 不採用 exception 的原因。已寫好、未使用 exception 的程式碼,若想改用 exception 來處理錯誤,往往會打破原本的設計架構。而這樣的程式碼勢必也無法和其它有使用 exception 的程式碼互相合作。因此 Google 才基於實務考量,全面禁用 exception。
%
其他參考資料
Defensive Programming 防禦性程式設計
https://ihower.tw/blog/archives/7259
[C++] Exception Safety & Guarantees
http://shininglionking.blogspot.tw/2014/03/c-exception-safety-guarantees.html
如何利用「自訂例外狀況」處理無法繼續執行的錯誤
http://blog.miniasp.com/post/2009/09/30/How-to-Designing-Custom-Exceptions.aspx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment