1

notify在多线程 Qt 应用程序中重新实现函数时要注意什么?这是一个示例实现。目前没有错误,但我担心可能会出现错误,因为 Qt 中的多线程使用使用通知功能的信号槽进行通信。

TApplication::notify(QObject *receiver, QEvent *event)
{
    bool returnValue(false);
    try
    {
        returnValue = QApplication::notify(receiver, event);
    }
    catch (IExceptionBase& e)
    {
        if (!fMain.isNull())
        {
            //report error to output and file log
        }
        else
        {
            //report error to output
        }
    }
    catch (...)
    {
        if (!fMain.isNull())
        {
            //report error to output and file log
        }
        else
        {
            //report error to output
        }
    }
    return returnValue;
}

fMain是一个具有报告功能的模块

4

2 回答 2

2

捕获所有异常notify是一种反模式。过去这样做很酷,但结果证明是个坏主意。所以不要那样做。如果您的插槽或事件处理程序抛出异常,请将其代码包装在一个try-catch块中。notify给你一种错误的安全感,因为在很多情况下,信号和直接连接的插槽恰好是从事件处理程序中调用的。但有时情况并非如此,您的代码会由于未处理的异常而崩溃。

确保您熟悉核心 C++ 错误处理指南C++ 异常和错误处理常见问题解答

于 2016-07-01T15:49:48.367 回答
2

在 Qt5 中,这是安全的。但是,从文档来看,在 Qt6 中,这将不再在主线程之外工作,事实上,该函数正在考虑在 Qt6 中完全弃用。

正如 Kuba Ober 指出的那样,重新实现notify以捕获异常是一个坏主意,因为其他线程中的事件和任何排队的信号都是异步传递的。

于 2016-07-01T11:30:14.397 回答