来自std :: exception的更多信息

时间:2016-01-27 10:03:19

标签: c++ qt exception gcc

我正在为ARM处理器编写QT应用程序。我使用gcc-linaro-arm-linux-gnueabihf compiller。

我尝试捕获std :: exception

try
{        
   ----CODE HERE----
}
catch(QException e)
{
    qCritical() << e.what();
}
catch(std::exception e)
{
    qCritical() << e.what();
}

作为输出我有:

----- Dev started -----
std::exception
----- Dev finished -----

没有关于例外的详细信息。

我可以看到发生了什么样的std :: excpetpion吗?

另一个问题是它的qt应用程序。 Makefile由qmake生成。我不能直接将选项传递给gcc compiller。

2 个答案:

答案 0 :(得分:5)

问题在于您切片异常对象 - 您按值捕获它,因此任何子类信息都会丢失。请按const &抓住,以保持其类型和&amp;数据存活:

catch(const std::exception &e)
{
    qCritical() << e.what();
}

此外,如果您想要对更具体的类型(从std::exception派生的类)进行特殊处理,您可以添加它:

catch (const std::invalid_argument &e)
{
  qCritical() << "Invalid argument: " << e.what();
}
catch (const std::domain_error &e)
{
  qCritical() << "Domain error: " << e.what();
}
catch (const std::excetion &e)
{
  qCritical() << "Other exception: " << e.what();
}

请注意catch子句的顺序很重要:它们按顺序处理,并使用第一个匹配。因此必须在基类之前列出派生类。

答案 1 :(得分:2)

我不确定我是否正确理解了您的问题,但直接回答您的问题很简单:

try
{        
   ----CODE HERE----
}
catch(const QException& e)
{
    qCritical() << "QException exception\n" << e.what();
}
catch(const std::exception& e)
{
    qCritical() << "standard library exception\n" << e.what();
}

不要忘记,如果抛出另一种类型的异常,你可以随时抓住它:

catch(...)
{
    qCritical() << "bad bad things happened, unknown exception!\n";
}