Re: [問題] throw跟return?
※ 引述《volleyp (彼德さん)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: 想請問在處理錯誤的時候,會怎麼選擇用throw還是return false ?
: 最近在看資料結構的書,裡面的程式碼在判斷式的地方好像都是用throw來處理不合條件
: 的情況。但之前我看其他人寫遊戲的時候會用return false來做處理。蠻好奇這兩種
: 做法的差異在哪邊!麻煩前輩們指教一下,謝謝!
個人是不推薦Exception派的
C++雖然有Exception
但是使用上卻很難安全使用
有幾個問題應該可以提出來討論看看
也許只是我功力還不夠
首先是資源釋放問題
C++沒有GC!
發生例外的時候
會跳出try的區域到catch去
如果沒有使用shared_ptr
那麼成功配置的資源將會無法釋放
因為已經拿不到那些local指標
這不只發生在函數內部
物件創立時也可能發生
比方說配置物件後方的member data時
發生要不到記憶體而丟出例外
建構失敗之後就不會執行解構
結果前面的配置空間就會發生memory leak
這個方面可以參考書籍Efficient C++
不過我覺得不是每個人都會讀過這本書
再來是程式可讀性
return error code的方式
可以很容易就看出程式撰寫時已經考慮哪些問題
throw exception並不容易看出程式是否思考仔細
而且顯然與別人合作寫程式的時候
需要大家先規範好要丟出什麼樣的東西
用error code反而簡單很多,寫個enum或是define就好
只傳遞問題敘述,但是函數內部的問題,由該函數自己處理
這樣程式會比較內斂一點
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.210.62
→
04/12 13:26, , 1F
04/12 13:26, 1F
另外還有一點要補充的
例外機制很難在程式中後期加入
這不能靠重構解決問題
不是資料封裝性的事情而已
還直接影響程式運行邏輯
要就只能在初期就考慮周詳
不然就乾脆不要使用
※ 編輯: iamstudent 來自: 140.113.210.62 (04/12 13:42)
→
04/12 14:31, , 2F
04/12 14:31, 2F
→
04/12 14:32, , 3F
04/12 14:32, 3F
→
04/12 14:32, , 4F
04/12 14:32, 4F
→
04/12 14:47, , 5F
04/12 14:47, 5F
→
04/12 14:49, , 6F
04/12 14:49, 6F
→
04/12 14:50, , 7F
04/12 14:50, 7F
→
04/12 14:52, , 8F
04/12 14:52, 8F
→
04/12 14:53, , 9F
04/12 14:53, 9F
推
04/12 14:53, , 10F
04/12 14:53, 10F
→
04/12 14:54, , 11F
04/12 14:54, 11F
※ 編輯: iamstudent 來自: 140.113.210.62 (04/12 14:54)
→
04/12 14:56, , 12F
04/12 14:56, 12F
推
04/12 15:00, , 13F
04/12 15:00, 13F
→
04/12 15:02, , 14F
04/12 15:02, 14F
→
04/12 15:03, , 15F
04/12 15:03, 15F
謝謝,這樣我就理解了
我原本的角度是函數撰寫者與使用者都是自己人的情況
所以忽略了撰寫library的情形
由於函數傳回值只有一個
改用ref參數傳回error code
那麼函數的介面會變很醜
看了你推薦的那篇文章之後還瞭解一點
使用error code方式處理
每次呼叫都要作的檢查
會出現很多check處理
我目前有碰過一些C的library
作法是有額外的Check函數
可以在一連串動作之後才檢查error code
而不是每個動作都檢查
也不需要在每個函數上面多出ref傳遞錯誤代碼
函數的參數就可以很乾淨
這樣應該也是一個解法
此外Constructor也有解法
就是Constructor放空
然後多一個Init的成員函數
使用者必須手動初始化
會placement new的人可能覺得很多餘
可是這樣其實很容易被理解
獨立初始化就可以輕易處理error code
不過這樣要配合stl容器就有點頭痛了
裡面有copy constructor...
→
04/12 15:20, , 16F
04/12 15:20, 16F
→
04/12 15:21, , 17F
04/12 15:21, 17F
※ 編輯: iamstudent 來自: 140.113.210.62 (04/12 15:33)
推
04/12 15:32, , 18F
04/12 15:32, 18F
→
04/12 15:50, , 19F
04/12 15:50, 19F
推
04/12 17:45, , 20F
04/12 17:45, 20F
→
04/12 17:46, , 21F
04/12 17:46, 21F
→
04/12 17:47, , 22F
04/12 17:47, 22F
推
04/12 17:48, , 23F
04/12 17:48, 23F
→
04/12 17:49, , 24F
04/12 17:49, 24F
→
04/12 17:50, , 25F
04/12 17:50, 25F
→
04/12 17:50, , 26F
04/12 17:50, 26F
推
04/12 18:11, , 27F
04/12 18:11, 27F
→
04/12 18:12, , 28F
04/12 18:12, 28F
→
04/12 18:12, , 29F
04/12 18:12, 29F
推
04/12 19:03, , 30F
04/12 19:03, 30F
→
04/12 19:04, , 31F
04/12 19:04, 31F
→
04/12 19:14, , 32F
04/12 19:14, 32F
→
04/12 19:15, , 33F
04/12 19:15, 33F
→
04/12 19:17, , 34F
04/12 19:17, 34F
→
04/12 22:33, , 35F
04/12 22:33, 35F
推
04/13 12:29, , 36F
04/13 12:29, 36F
→
04/13 12:30, , 37F
04/13 12:30, 37F
→
04/13 12:30, , 38F
04/13 12:30, 38F
→
04/13 12:31, , 39F
04/13 12:31, 39F
→
04/13 12:34, , 40F
04/13 12:34, 40F
→
04/13 12:35, , 41F
04/13 12:35, 41F
討論串 (同標題文章)