【问题标题】:Eclipse + wxWidgets + Boost -- exceptions not being displayedEclipse + wxWidgets + Boost -- 不显示异常
【发布时间】:2012-12-27 17:45:02
【问题描述】:

我一直在 Windows 7 x64 下编写一个简单的 GUI 地址簿程序,使用 wxWidgets2.8.12 和 boost::serialization 以及 mingw4.6 和 Eclipse CDT Juno。

在使用 boost::archive::text_iarchive 和 text_oarchive 对文件中的条目进行序列化的功能时,我发现该程序将在启动时停止工作。它会简单地启动然后立即终止。 g++ 编译得很好,没有任何东西被写入 stdout 或 stderr。在使用 gdb 进一步调查该问题后,我发现 boost 库确实抛出了异常。

这本身不是问题。问题是这个异常从未显示在任何 Eclipse 的控制台中,所以我什至不知道它存在,直到单步执行整个应用程序。异常本身很容易解决,但由于缺乏输出而被证明是非常有问题的。在 Debug 和 Release 配置中构建和运行应用程序时不显示任何内容。

我的问题本质上是这样的:为什么这些库异常没有被输出,我需要做些什么来确保它们正确显示?经过一段时间的搜索,我还没有找到任何有用的东西,当然,我们将不胜感激。提前感谢任何能够提供帮助的人。

【问题讨论】:

  • 首先要做的是打开一个mingw shell,找到编译好的二进制文件并尝试从shell运行它。它现在输出异常吗?那么可能是 Eclipse 的问题,如果还是没有看到异常输出说明 Eclipse 不是问题,可以关注 wxWidgets 和 boost。
  • 刚刚试过。我从 Debug 和 Release 目录运行编译的可执行文件的 shell 没有得到任何输出,所以这似乎指向涉及 wxWidgets 的东西(或者可能是 boost,但前者对我来说似乎更可能)

标签: c++ mingw wxwidgets eclipse-cdt boost-serialization


【解决方案1】:

您可以做一件事,尽管它需要在顶层使用 catch 块或使用 set_unexpected() 类似于以下内容。

#include <boost/exception/diagnostic_information.hpp>

...

catch(...)
{
    std::cerr << "Unhandled exception!" << std::endl <<
    boost::current_exception_diagnostic_information();
    return 1; //or whatever...
}

您当然可以在激烈的 catch(...) 之前过滤掉 boost/std 异常,但您明白了。

编辑:

您可能看不到异常的另一个原因是,如果在堆栈展开期间(出于某种原因)调用它 - 然后它会调用 terminate 并停止死...

【讨论】:

  • 不是世界上最干净的东西,但它似乎有效,这很重要。当放置在抛出异常的代码周围时,它确实会使用正确的信息抛出异常。唯一的问题是它并没有真正解释问题,只是覆盖了它。了解将来可能有类似问题的代码的根本原因会很有用。总的来说,它似乎确实可以满足我的需求,至少目前是这样。
  • 是的,我能理解你对这类问题的沮丧——我正在绞尽脑汁思考为什么会发生这种情况:) 如果我想到任何事情,我会更新......跨度>
  • 我猜这与 wxWidgets 抑制错误等有关。从我使用它的角度来看,它似乎没有按照标准进行编码。如果我有时间,我可能会改用 QT 之类的东西,但它只是一个用于课堂的小应用程序(仍在学习中),即使我想全力以赴,我也没有时间重新-写一切。
  • wxWidgets 绝对不会自己吞下任何异常。虽然它在内部不使用任何异常(不是因为它是在没有考虑标准的情况下编码的,而是因为它在使用 C++ 异常时重新启动根本不切实际),但它是异常安全的,因为您的事件处理程序可以抛出异常你可以在wxApp::OnExceptionInMainLoop() 中找到它们。根据我的经验,指责您使用的工具通常不是解决程序问题的最有效方式。
  • 我不一定要责怪它,我想不出是什么导致异常根本不显示。这很可能是我的代码;我很难声称自己是一个经验丰富的程序员,但是当我没有做任何事情来操纵我的源代码中的异常抛出或处理时,这似乎有点奇怪。如果不手动处理,异常通常不会至少有一些输出吗?
猜你喜欢
  • 1970-01-01
  • 2016-01-11
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多