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

时间:2009-11-19 11:01:58

标签: c++ exception-handling

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

terminate called after throwing an instance of 'Poco::SystemException'
  what():  System exception

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

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

任何人都知道这个未被捕获的异常被捕到了什么代码?

2 个答案:

答案 0 :(得分:12)

  

任何人都知道这个未被捕获的异常被捕到了什么代码?

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

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

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

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

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

答案 1 :(得分:0)

我得到了同样的错误。我在Poco :: Runnable类的run函数中使用了try catch块。我从这个类中删除了try catch块,并使用了Poco :: ErrorHandler类的派生来处理错误。在此之后我停止了这个错误。