毫无疑问,很多人都熟悉 Alexandrescus 先生的 ScopeGuard 模板(现在是 Loki 的一部分)以及此处介绍的新版本 ScopeGuard11:http: //channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012- Andrei-Alexandrescu-Systematic-Error-Handling-in-C
来源: https ://gist.github.com/KindDragon/4650442
在他在 c++ 和 2012 年以后的演讲中,他提到他找不到正确检测范围是否因异常而退出的方法。因此,当且仅当范围因异常而退出时,他无法实现 SCOPE_FAIL 宏,该宏将执行提供的 lambda(通常用于回滚代码)。这将使dismiss() 成员函数变得不需要,并使代码更具可读性。
由于我绝不像 Alexandrescu 先生那样天才或经验丰富,我希望实现 SCOPE_FAIL 并不像这样容易:
~ScopeGuard11(){ //destructor
if(std::uncaught_exception()){ //if we are exiting because of an exception
f_(); //execute the functor
}
//otherwise do nothing
}
我的问题是为什么不呢?