在try块的末尾执行相同的操作,并在try-catch语句中执行所有catch时钟

时间:2015-12-06 15:37:54

标签: c++ c++11 try-catch c++14 code-duplication

这是一种避免代码重复的方法(FinalAction块中的catch块和try块中的try { // some actions including creation of new objects FinalAction(); } catch (const Exception1& ex1) { ProcessException1(ex1); FinalAction(); } catch (const Exception2& ex2) { ProcessException2(ex2); FinalAction(); } // ... catch (const ExceptionN& exN) { ProcessExceptionN(exN); FinalAction(); } catch (...) { ProcessUnknownException(); FinalAction(); } 函数调用吗?

FinalAction()

更新: try应该在 try { // some actions including creation of new objects } catch (const Exception1& ex1) { ProcessException1(ex1); } catch (const Exception2& ex2) { ProcessException2(ex2); } // ... catch (const ExceptionN& exN) { ProcessExceptionN(exN); } catch (...) { ProcessUnknownException(); } FinalAction(); 块中创建的对象的析构函数之前调用。像下面这样简单的解决方案在这里不起作用。

FinalAction

有关try的更多信息:它不会丢弃,也不会清除Windows块中分配的任何资源。

3 个答案:

答案 0 :(得分:1)

虽然您的问题不完全重复,但this question的答案是恰当的。

你似乎要求的是等同于C ++中的finally - 子句,答案是在C ++中这通常是通过RAII解决的。

我不会重复链接的SO问题中给出的相当广泛的答案,但总的来说,确保资源的清理是在析构函数中完成的。您的FinalAction()可能就是现在正在清理资源的那个。

答案 1 :(得分:0)

我不知道 ProcessExceptionX FinalAction 属于哪些类或 ProcessException 属于哪些类,但也许你可能只有一个 ProcessException 获取参数并执行 FinalAction ,例如:

...
try {
  FinalAction();
}
catch (const Exception1& ex1) {
  ProcessException(ex1);
}
...

void ProcessException (Exception e) {
 // do things
 FinalAction();
}

答案 2 :(得分:-2)

最简单的方法就是在try阻止之后调用它。

bool success = false;
try
{
    // some actions including creation of new objects
    FinalAction();
    success = true;
}
catch (const Exception1& ex1)
{
    ProcessException1(ex1);
}
if (!success)
    FinalAction();

然而,这样做非常可疑,而不是使用课程来管理您使用FinalAction清理的任何资源。