在 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()
可能正在清理资源。
我不知道 类 ProcessExceptionX 和 FinalAction 属于哪个 类 或者 属于什么ProcessException 可以,但也许你可以只有一个 ProcessException 获取参数并执行 FinalAction,例如:
...
try {
FinalAction();
}
catch (const Exception1& ex1) {
ProcessException(ex1);
}
...
void ProcessException (Exception e) {
// do things
FinalAction();
}
这是一种避免代码重复的方法吗(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()
可能正在清理资源。
我不知道 类 ProcessExceptionX 和 FinalAction 属于哪个 类 或者 属于什么ProcessException 可以,但也许你可以只有一个 ProcessException 获取参数并执行 FinalAction,例如:
...
try {
FinalAction();
}
catch (const Exception1& ex1) {
ProcessException(ex1);
}
...
void ProcessException (Exception e) {
// do things
FinalAction();
}