Qts古老的QCoreApplicationPrivate :: sendPostedEvents异常吃掉

时间:2014-04-29 08:41:23

标签: c++ qt

如果你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

2 个答案:

答案 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