在抛出'Poco :: SystemException'的实例后终止调用

Omr*_*dan 5 c++ exception-handling

有时(大约100次运行中的1次),我的程序终止于此消息:

terminate called after throwing an instance of 'Poco::SystemException'
  what():  System exception
Run Code Online (Sandbox Code Playgroud)

我的代码不是捕获异常的代码(我的所有捕获都更冗长),我不确定它被捕获的位置.异常很可能包含有用的消息,但它不是通过what()方法返回的,而是通过displayText()方法返回的.

字符串"在抛出一个实例后调用终止"在Google中有〜600k,所以它可能是由编译器插入的代码或某些公共库(pthread?)打印的.当程序在Linux上运行时(我从不在Windows上),我只看到此错误消息.

谁知道这个未被捕获的异常被捕到了什么代码?

Fer*_*yer 13

谁知道这个未被捕获的异常被捕到了什么代码?

根据定义,未捕获的异常不会被捕获.

如果无法处理异常,C++异常机制将调用std::terminate()(请参阅include头<exception>),这将调用可自定义的终止处理程序.在您的平台上,标准终止处理程序打印输出std::exception::what()(Poco的异常继承自).不幸的是,Poco的例外设计方式,这将不包含任何有用的信息.

有多种方法无法处理异常:

  • 找不到合适的catch()处理程序,退出机制退出main().您可以尝试将main()代码包装起来try...catch以打印异常displayText().
  • 函数退出时出现与其异常规范(... functionname(...) throw(...))不匹配的异常.这将调用std::unexpected()哪个调用std::terminate()(默认情况下).
  • 在另一个异常的展开过程中调用的析构函数中抛出异常.永远不要在析构函数中抛出异常!
  • 尝试创建原始异常对象时抛出异常.切勿在自定义异常类中抛出异常!

当使用Poco线程并且线程被未处理的异常终止时,Poco将调用其内部ErrorHandler并且程序将不会退出,因此我怀疑这是一个线程问题.