识别终止时抛出的C ++异常

时间:2014-07-04 13:24:49

标签: c++ visual-studio-2012

有没有办法确定我使用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去正确的地方的问题,然后再尝试解决这个问题。

3 个答案:

答案 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 ;
 }

并确保抓住一切。