我正在为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。
答案 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";
}