re: 覺(jué)得 Loki::ScopeGuard 似乎不該在它自己里面 try … catch …
2011-03-26 07:26 |
rollback函數(shù)本身就不應(yīng)該拋出異常。
異常安全的代碼依賴一些無(wú)拋出的代碼來(lái)執(zhí)行commit或者rollback。
所以:
1. 本來(lái)面目是還不了的
rollback動(dòng)作就應(yīng)該無(wú)拋出的執(zhí)行, 無(wú)論它本身是一個(gè)無(wú)拋出的函數(shù), 還是被scopeguard的析構(gòu)所吞掉。
2. scopeguard是否應(yīng)該插手
我也認(rèn)為它多管閑事了。
無(wú)拋出是rollback函數(shù)自身的責(zé)任。
沒(méi)有無(wú)拋出保證就不能稱為一個(gè)rollback。
應(yīng)該努力將其寫為rollback, 然后scopeguard僅僅考慮注冊(cè)而已。
對(duì)實(shí)在沒(méi)有時(shí)間與精力寫為無(wú)拋出的rollback, 可自行吞掉:
rollback_nothrow(...) { rollback(...) }
makeguard(rollback_nothrow, ...)
3. loki
loki應(yīng)該算是一個(gè)實(shí)驗(yàn)/教學(xué)性質(zhì)的庫(kù)吧?
所以盡可能的多傳授一些C++的知識(shí), 比如"析構(gòu)絕對(duì)不能拋出異常"。
而沒(méi)太注重"該保證是誰(shuí)的責(zé)任"。
所以就選擇一個(gè)簡(jiǎn)單且效率稍微有點(diǎn)低的方案了。
回復(fù) 更多評(píng)論