【发布时间】:2015-12-06 15:37:54
【问题描述】:
这是一种避免代码重复的方法吗(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 和 catch 调用相同的方法会提示代码异味。您能否向我们提供有关您要完成的工作的更多详细信息?也许这有助于找到解决方案。
-
FinalAction()可能会抛出吗?如果不只是使用 RAII -
@XavierÁlvarez 实际上这是一个简单的等待按键。但它给了我一个概括的想法。
-
@Mgetz 如何在这里使用 RAII?据我所知,将在第一个
catch块之前调用 RAII 对象的析构函数。 -
@Puppy 那么在所有
catch块之后就和它的简单调用一样。
标签: c++ c++11 try-catch c++14 code-duplication