Sas*_*cha 11 c++ exception finally c++-faq
由于finally在C++中没有,你必须使用RAII设计模式,如果你希望你的代码是异常安全的.一种方法是使用像这样的本地类的析构函数:
void foo() {
struct Finally {
~Finally() { /* cleanup code */ }
} finalizer();
// ...code that might throw an exception...
}
Run Code Online (Sandbox Code Playgroud)
与直接解决方案相比,这是一个很大的优势,因为您不必编写清理代码2次:
try {
// ...code that might throw an exception...
// cleanup code (no exception)
} catch (...) {
// cleanup code (exception)
throw;
}
Run Code Online (Sandbox Code Playgroud)
本地类解决方案的一大缺点是您无法直接访问清理代码中的局部变量.因此,如果您需要访问它们,它会使您的代码膨胀很多,无论如何:
void foo() {
Task* task;
while (task = nextTask()) {
task->status = running;
struct Finally {
Task* task;
Finally(Task* task) : task(task) {}
~Finally() { task->status = idle; }
} finalizer(task);
// ...code that might throw an exception...
}
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:是否有一个结合了两个优点的解决方案?这样你a)不必编写重复的代码和b)可以访问清理代码中的局部变量,就像task在上一个例子中一样,但没有这样的代码膨胀.
Séb*_*rra 16
struct Finally您可以在类的函数中提取清理代码而不是定义,Task并使用Loki的ScopeGuard.
ScopeGuard guard = MakeGuard(&Task::cleanup, task);
Run Code Online (Sandbox Code Playgroud)
有关ScopeGuards的更多信息,另请参阅DrDobb的这篇文章和另一篇文章.
这是一种如此丑陋的方式:(你来自Java吗?)
请阅读这篇文章:
C++是否支持'finally'块?(我听到的'RAII'是什么?)
它解释了为什么最终是这样一个丑陋的概念,以及为什么RIAA更优雅.
| 归档时间: |
|
| 查看次数: |
6769 次 |
| 最近记录: |