【问题标题】:More information from std::exception来自 std::exception 的更多信息
【发布时间】:2016-01-27 10:03:18
【问题描述】:

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

我试图抓住 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 编译器。

【问题讨论】:

标签: c++ qt exception gcc


【解决方案1】:

问题在于您正在切片异常对象——您正在按值捕获它,因此任何子类信息都会丢失。通过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 子句的顺序很重要:它们是按顺序处理的,并且使用第一个匹配的。所以派生类必须列在基类之前。

【讨论】:

    【解决方案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";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2015-04-17
      • 2014-11-03
      • 1970-01-01
      相关资源
      最近更新 更多