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