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

Do the same action at the end of the try block and all catch clocks in a try-catch statement

这是一种避免代码重复的方法吗(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 块中分配的任何资源。

最简单的做法就是在 try 块之后调用它。

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

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

尽管您的问题不完全相同,但 this question 的答案是恰当的。

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

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

我不知道 类 ProcessExceptionXFinalAction 属于哪个 类 或者 属于什么ProcessException 可以,但也许你可以只有一个 ProcessException 获取参数并执行 FinalAction,例如:

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

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