0

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

4

2 回答 2

1

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

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

于 2012-08-02T21:43:56.470 回答
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-block 中,但是当您捕获异常时,GUI 很可能已经被破坏,因此实际上不可能从异常中恢复。

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

于 2012-09-02T15:21:22.260 回答