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

C++ 在try-catch语句中的try块和所有catch时钟的末尾执行相同的操作,c++,c++11,try-catch,c++14,code-duplication,C++,C++11,Try Catch,C++14,Code Duplication,这是避免代码重复的一种方法吗(FinalAction函数调用在所有catch块和try块中) 更新:FinalAction()应在try块中创建的对象的析构函数之前调用。所以像下面这样的简单解决方案在这里不起作用 try { // some actions including creation of new objects } catch (const Exception1& ex1) { ProcessException1(ex1); } catch (const Ex

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

更新:
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();

然而,这样做而不是使用类来管理您正在使用
FinalAction

清理的任何资源是相当可疑的,尽管您的问题不是完全重复的,但答案是正确的

你似乎想要的是C++中的“代码>最后的/COD> >子句,答案是C++中通常通过RAII.< /P>解决。


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

我不知道ProcessExceptionX和FinalAction属于哪个类,或者ProcessException做什么,但您可能只有一个ProcessException获取参数并执行FinalAction,例如:


从try和catch调用相同的方法会产生代码气味。你能给我们提供更多关于你想要完成什么的细节吗?也许这会有助于找到解决方案。
FinalAction()
是否可能引发?如果不只是使用RAII@Xavier阿尔瓦雷斯事实上,这是一个简单的等待按键。但它给了我一个概括的想法。@Mgetz如何在这里使用rai?据我所知,RAII对象的析构函数将在第一个
catch
块之前被调用。然后,它与在所有
catch
块之后对其进行简单调用相同。谢谢您提供的解决方案。但它有点难看,不是吗?我不使用
FinalAction
清理任何资源,它是一个简单的
wait-for-a-keypress
操作。@Constructor:它直接表达您想要的语义-如果抛出,请执行FinalAction。@Puppy是的,我知道您的解决方案在这里是合适的。我本想用同样的方式来做,但决定从现在开始寻找更好的解决方案。我还没有找到,没有更好的解决办法。你需要编写代码来完成你想让它做的事情。你无法回避这个问题。不,在我的问题中,
finaclation
与资源清理毫无关系。它离成为一个模糊不清的复制品还有一百万英里,答案是什么?有七个@LightnessRacesinOrbit:公认的答案是排名第二的两倍以上,它很好地描述了RAII。不知道FinalAction()函数做了什么,在问题更新之前,“Use RAII”在我看来是一个很好的答案。@dhavenith:这是一个非常糟糕的答案。OP希望了解如何使用RAII以达到最佳效果。仅仅“使用RAII”是没有帮助的。不,我不能<代码>例外1<代码>异常n是没有公共基的不同异常类。那么未知异常的处理呢?
bool success = false;
try
{
    // some actions including creation of new objects
    FinalAction();
    success = true;
}
catch (const Exception1& ex1)
{
    ProcessException1(ex1);
}
if (!success)
    FinalAction();
...
try {
  FinalAction();
}
catch (const Exception1& ex1) {
  ProcessException(ex1);
}
...

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