有没有办法确定我使用terminate
设置的set_terminate
处理程序中抛出了哪种类型的异常?
如果抛出 my 异常中的一个,我希望套件中的程序弹出一个消息框,但如果异常来自其他地方则不会。
编辑:根据Brian的回答尝试了代码。在投掷之后它没有做任何cout;
// set_terminate example
#include <iostream> // std::cerr
#include <exception> // std::set_terminate
#include <cstdlib> // std::abort
using namespace std;
class FooException {};
class BarException {};
void my_terminate() {
try {
cout << "This line gets printed... those below do not.\n";
throw; // rethrows
}
catch (FooException) {
cout << "FooException.\n";
// pop up message box
}
catch (BarException) {
cout << "BarException.\n";
// pop up message box
}
catch (...) {
cout << "Unclassified exception.\n";
// not one of my exceptions
abort();
}
cout << "Doesn't print this either.\n";
}
int main (void)
{
std::set_terminate (my_terminate);
throw FooException ();
return 0;
}
这可能是Visual Studio问题。 (它不会在出局时打电话给dtors。)我将问另一个关于让Visual去正确的地方的问题,然后再尝试解决这个问题。
答案 0 :(得分:3)
在终止处理程序中,异常仍被视为“活动”(请参阅C ++11§15.3/ 7和§15.3/ 8)。因此,可以使用current_exception
重新搜索或访问它。
void my_terminate() {
try {
throw; // rethrows
} catch (FooException) {
// pop up message box
} catch (BarException) {
// pop up message box
} catch (...) {
// not one of my exceptions
abort();
}
}
答案 1 :(得分:0)
您可以创建自己的异常基类,捕获main中的所有异常并重新抛出从基类派生的所有异常。这样,只有您的例外才能使用terminate
答案 2 :(得分:0)
最好的解决方案是从std :: exception
派生所有异常类然后你可以做
try
{
}
catch . . .
catch . . .
catch . . .
catch (std::exception &ee)
{
cerr << ee.what () << end ;
}
并确保抓住一切。