ScopeGuard 只是幫我們調用一個函數而已,至于這個函數是否有異常出來,它不該悄悄地把它吞了,而應該還我們本來面目,不知道是不是?可是為什么幾乎所有介紹 ScopeGuard 的文章都說這 try … catch … 用得好呢?
posted on 2011-03-23 09:39
溪流 閱讀(2515)
評論(6) 編輯 收藏 引用 所屬分類:
C++
評論:
# re: 覺得 Loki::ScopeGuard 似乎不該在它自己里面 try … catch …
2011-03-23 10:16 |
如果關注函數本身代碼有異常,
就需要try..catch來處理了,異常發生時堆棧會unwind,而且代碼看起太丑陋,就封裝下咯。
Loki::ScopeGuard 輕量的RAII ,對資源管理與異常安全提供比較好,可以只關注于異常部分。
回復 更多評論
# re: 覺得 Loki::ScopeGuard 似乎不該在它自己里面 try … catch …
2011-03-23 10:34 |
Loki::ScopeGuard實際上是一個通用的RAII,它是通過在ScopeGuardImplBase的所有派生類的析構函數里面SafeExecute(*this)來做到RAII,而在SafeExecute做資源釋放操作是通過調用派生類的fun_,如果不try...catch,那么fun_執行如果發生異常的話,那異常就逃離了析構函數。在C++中析構函數是不應該有異常產生的,詳見《Effective C++》。
回復 更多評論
# re: 覺得 Loki::ScopeGuard 似乎不該在它自己里面 try … catch …
2011-03-25 11:09 |
# re: 覺得 Loki::ScopeGuard 似乎不該在它自己里面 try … catch …
2011-03-26 07:26 |
rollback函數本身就不應該拋出異常。
異常安全的代碼依賴一些無拋出的代碼來執行commit或者rollback。
所以:
1. 本來面目是還不了的
rollback動作就應該無拋出的執行, 無論它本身是一個無拋出的函數, 還是被scopeguard的析構所吞掉。
2. scopeguard是否應該插手
我也認為它多管閑事了。
無拋出是rollback函數自身的責任。
沒有無拋出保證就不能稱為一個rollback。
應該努力將其寫為rollback, 然后scopeguard僅僅考慮注冊而已。
對實在沒有時間與精力寫為無拋出的rollback, 可自行吞掉:
rollback_nothrow(...) { rollback(...) }
makeguard(rollback_nothrow, ...)
3. loki
loki應該算是一個實驗/教學性質的庫吧?
所以盡可能的多傳授一些C++的知識, 比如"析構絕對不能拋出異常"。
而沒太注重"該保證是誰的責任"。
所以就選擇一個簡單且效率稍微有點低的方案了。
回復 更多評論
# re: 覺得 Loki::ScopeGuard 似乎不該在它自己里面 try … catch …
2011-03-28 14:49 |
@OwnWaterloo
你也認為它多管閑事了?!好~哈哈!
回復 更多評論
# re: 覺得 Loki::ScopeGuard 似乎不該在它自己里面 try … catch …
2011-03-28 18:45 |
@溪流
恩, 我還覺得 loki.scopeguard應該區分為
1. rollback 注冊的動作可取消 —— loki.scopeguard實際實現
2. on_exit 注冊的動作一定執行 —— 其實這個用得不少
將 loki.scopeguard 用于 on_exit 的情況很浪費啊……
需要開辟局部變量, 需要 if 測試, 而且這個測試代碼是在每一個退出點產生的……
這些開銷根本不需要的。
loki應該是為了簡單吧, 一頂倆……
回復 更多評論
本博客中提供的任何源代碼、非開源軟件以及其他作品,如未加特別說明,均屬原創。如果其中有版權說明,則請遵守版權說明;如果沒有版權說明,任何人都可以將其用于任何合法場合,包括但不限于商業、非商業的。如果您有使用,特別是用于商業場合,您最好通知我一下,但這并不是必須的。本博客中的任何非原創作品,請遵守原作者的版權說明。
|
|
30 | 31 | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
常用鏈接
留言簿(21)
隨筆分類(124)
隨筆檔案(90)
我的鏈接
友情鏈接
積分與排名
最新隨筆
最新評論

閱讀排行榜
評論排行榜