使用Qt、MFC和CMake进行try/catch

try/catch with Qt, MFC and CMake

本文关键字:进行 try catch CMake Qt MFC 使用      更新时间:2023-10-16

我使用CMake来创建我的项目。在该项目中,我主要使用QtC++和一些MFC函数作为硬件接口。在代码中使用try/catche->ReportError()或其他一些异常语句有意义吗?

如果使用MFC创建对话框,则只需要在抛出任何东西时抛出指向CException派生对象的指针。这是因为DoModal函数包含一个catch来恢复关键应用程序状态,然后是一个re-show;如果您抛出任何其他类型的异常,它将被遗漏,并且您的应用程序将被挂起。

我不知道Qt是否也有类似的问题。

您当然可以将异常与Qt一起使用。问题是,它们有多有用。例如,考虑以下类别

class Thrower : public QObject
{
    Q_OBJECT
public slots:
    void throwException()
    {
        throw 42;
    }
};

异常在插槽中引发。要捕获此异常,必须包装触发时隙的信号,在try块中,例如

class Catcher : public QObject
{
    Q_OBJECT
public:
    Catcher(Thrower* t)
    {
        connect(this, SIGNAL(test()), t, SLOT(throwException()));
    }
    void catchTest()
    {
        try
        {
            emit test(); // Will trigger Thrower::throwException().
        }
        catch (int number)
        {
            qDebug() << "Caught" << number;
        }
    }
signals:
    void test();
};

不幸的是,并非总是可以使用这种方法。例如,将QPushButton::clicked()连接到Thrower::throwException()时,单击按钮将导致事件循环崩溃。

您可以将QApplication::exec()封装在try块中,但当您捕获异常时,GUI很可能已经被破坏,因此不可能从异常中恢复。

还可以查看有关异常安全的Qt文档。