1. 程式人生 > >跟我學程式碼架構設計模式之--異常還是返回值?

跟我學程式碼架構設計模式之--異常還是返回值?

廢話少說 直接正題

寫JAVA函式到底是用丟擲異常的方式還是用特定返回碼的方式來標識函式執行錯誤呢?

我來說說我的設計哲學: 用丟擲異常的方式比較好!

首先先來分析下程式執行的流程,當一個執行緒啟動後,不管是面向物件的語言還是面向過程的語言,本質上都是以函式作為執行單位的,函式巢狀函式,一個函式對應一個棧幀作為函式執行上下文,另外函式執行過程中還有可能操作堆區的資料。

更底層分析下,執行緒執行在執行cpu指令的時候如果出現指令或資料錯誤,就會產生一個CPU異常,然後跳轉到異常處理程式去處理錯誤,有些CPU異常可以恢復,比如缺頁異常,有些異常不可以恢復,直接中斷程式的執行~ 怎麼樣 發現了沒,作業系統和CPU都是採用的類似拋異常的方式來處理錯誤!

這裡先說說我的語義哲學:返回值應該代表一個函式成功執行後的結果,成功就是成功,函式能返回就代表函式執行成功,不應該在函式執行失敗後還要返回!也就是說,通向成功的路只有一條,錯誤絕對不能按正常的返回來處理!函式執行中出現錯誤,理應打斷正常的執行流程,從異常出口出去通知給上層呼叫者!

先分析下用函式返回值來標識函式錯誤的情況:通常做法是函式的成功失敗都通過返回值返回給呼叫者,如果被呼叫者沒有給出詳細的文件說明,在呼叫者看來,我不知道我呼叫你返回的到底是成功還是失敗,呼叫者必須在被呼叫者返回後的後續指令中同時處理所有可能的錯誤,這樣的話,函式返回就不是單一語義,即使函式返回確實是單一語義的成功!WTF!

再分析下用異常標誌錯誤的情況:被調函式在執行過程中丟擲異常,呼叫者的處理程式碼中捕獲各種異常並分別處理;呼叫者在被調者返回成功後就只有一種語義:成功!一切就很美好了~

另外異常處理還帶來額外的好處:

1 可以區分執行時異常和非執行時異常,很多執行時異常我們呼叫者無能為力,可以被允許不做捕獲處理,非執行時異常屬於程式錯誤,要求呼叫者必須做處理!

2得益於繼承機制,異常型別也可以繼承,我們可以按需捕獲父類異常或者具體異常,多麼美好的設計~

(完)