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

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

本文关键字:时钟 执行 catch 操作 语句 try-catch try      更新时间:2023-10-16

这是避免代码重复的一种方法吗(在所有catch块和try块中调用FinalAction函数)?

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块中分配的任何资源。

虽然你的问题不是完全重复的,但这个问题的答案是合适的。

你似乎一直在问的是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();
}

最简单的方法就是在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清理的任何资源是非常可疑的。