如果你google for" QCoreApplicationPrivate::sendPostedEvents exception",你会发现大量点击,可能至少部分是因为此方法会消除事件处理程序中抛出的异常(例如paint)事件处理程序,...)。程序员因此不知道抛出异常的位置并且难以找到他们的错误。我正在寻找解决这个问题的方法 - 另一个痛苦Qt
强加于程序员。这是qcoreapplication.cpp
的实际代码段:
#ifdef QT_NO_EXCEPTIONS
QCoreApplication::sendEvent(r, e);
#else
try {
QCoreApplication::sendEvent(r, e);
} catch (...) {
delete e;
locker.relock();
// since we were interrupted, we need another pass to make sure we clean everything up
data->canWait = false;
// uglehack: copied from below
--data->postEventList.recursion;
if (!data->postEventList.recursion && !data->canWait && data->eventDispatcher)
data->eventDispatcher->wakeUp();
throw; // rethrow
}
#endif
走向Qt
天才的方法!在我的代码的深处,抛出异常,但我不知道因为这个宝石在哪里。解决它的方法出现在上面的代码中:禁用异常支持并重新编译Qt
,或更改代码并重新编译。即使它可能是不可能的:在任何操作系统下是否存在针对此问题的其他解决方法?
编辑:我正在使用Qt4.8
。
答案 0 :(得分:1)
在Qt 5中,您需要做的就是重新实现QCoreApplication::notify
并在Qt之前捕获您的异常。那是 it 。例如,请参阅this answer。
在Qt 4中,您需要从Qt 5反向移植代码。
答案 1 :(得分:0)
一种可能的解决方案是使用gdb
' catch
命令:
(gdb) catch throw
如果再次发生抛出的情况,gdb
将停止执行debugee,并且可以使用bt
命令显示堆栈跟踪,从而找出该位置。 throw
。