尝试/捕获Qt,MFC和CMake

时间:2012-08-02 21:16:11

标签: c++ qt mfc cmake

我使用CMake创建我的项目。在项目中,我主要使用Qt C ++和一些MFC函数用于硬件接口。在代码中使用 try / catch e-> ReportError()或其他一些异常语句是否有意义?

2 个答案:

答案 0 :(得分:1)

如果你正在使用MFC来创建一个对话框,你只想抛出指向CException派生对象的指针,如果你扔掉任何东西的话。这是因为DoModal函数包含一个catch来恢复关键应用程序状态,然后重新抛出;如果你抛出任何其他类型的例外,它将被遗漏,你的申请将被挂起。

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

答案 1 :(得分:0)

您当然可以与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 documention