深入理解 ScopeGuard 与异常处理
1. ScopeGuard 简介
ScopeGuard 模式旨在当程序离开某个作用域时,无论离开的原因是正常结束、提前返回还是抛出异常,都能自动正确地执行各种清理和回滚操作。这使得编写错误安全的代码,尤其是异常安全的代码变得更加容易。只要在每个操作之后正确设置了相应的防护措施,就可以自动进行正确的清理和错误处理。
1.1 代码转换示例
下面是一个使用 ScopeGuard 完成代码转换的示例:
// Example 08a
void Database::insert(const Record& r) {
S.insert(r);
ON_SCOPE_EXIT { S.finalize(); };
ON_SCOPE_EXIT_ROLLBACK(SG){ S.undo(); };
I.insert(r);
SG.commit();
}
对于多个操作,每个操作都有自己的回滚和清理操作,代码可以扩展如下:
action1();
ON_SCOPE_EXIT { cleanup1; };
ON_SCOPE_EXIT_ROLLBACK(g2){ rollback1(); };
action2();
ON_SCOPE_EXIT { cleanup2; };
ON_SCOPE_EXIT_ROLLBACK(g4){ rollback2(); };
action3();
g2.commit();
g4.commit();
ScopeGuard与异常处理详解
超级会员免费看
订阅专栏 解锁全文
1082

被折叠的 条评论
为什么被折叠?



