如果在我的代码中我有以下代码段:
try {
doSomething();
} catch (...) {
doSomethingElse();
throw;
}
Run Code Online (Sandbox Code Playgroud)
抛出会重新抛出默认省略号处理程序捕获的特定异常吗?
我有一个模式,重复几个成员函数,如下所示:
int myClass::abstract_one(int sig1)
{
try {
return _original->abstract_one(sig1);
} catch (std::exception& err) {
handleException(err);
} catch (...) {
handleException();
}
}
bool myClass::abstract_two(int sig2)
{
try {
return _original->abstract_two(sig2);
} catch (std::exception& err) {
handleException(err);
} catch (...) {
handleException();
}
}
[...]
int myClass::abstract_n(bool sig3a, short sig3b)
{
try {
return _original->abstract_n(sig3a, sig3b);
} catch (std::exception& err) {
handleException(err);
} catch (...) {
handleException();
}
}
Run Code Online (Sandbox Code Playgroud)
其中抽象一个到n是纯虚拟抽象接口用于其的方法myClass和_original是具体实现.
我不喜欢这个模式在代码中重复,并希望找到一种方法来消除重复try/ catch模式和代码作为单个抽象,但我想不出一个在没有宏的情况下在C++中执行此操作的好方法.我认为有一种方法可以让模板更好地完成这项工作.
请建议一种简洁的方法来重构此代码以抽象出重复的模式.
我有一个类使用RAII进行清理,以防出现问题.这意味着该类包含一个标志,告诉它是否已完成工作,并且如果在调用构造函数时未设置此标志,则它正在执行清理任务并生成日志消息.现在我希望这个类变得更聪明一步,即它应该找出,如果错误发生了,因为工作被贬低(即抛出异常并且析构函数被调用)或者因为有人错过了这个类而且从不实际上完成了工作.这意味着如果异常处于活动状态,我必须在析构函数中找到它.如果找到一个,我会生成一条日志消息,可能会打印异常的内容然后重新抛出它.我猜是这样的.
Foo::~Foo () {
try { /* do not know what to put here */ }
catch( const std::exception & ex ) {
// produce error in log
throw;
}
catch( ... ) {
// produce some other log message
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
但是我不确定这是否会起作用,因为异常在调用析构函数之前已经激活,并且不是来自try块.另外我throw;在析构函数中使用了一个并且在这一点上抛出异常是一个非常糟糕的主意.所以我不会这样做,除非标准明确保证这个案例是这个规则的例外(没有双关语)(我不知道).
这是可能的,或者我应该以其他方式处理这种情况?