0

私はCMakeを使用してプロジェクトを作成しています。このプロジェクトでは、主にQtC++といくつかのMFC関数をハードウェアインターフェイスに使用しています。コードでtry/catch e-> ReportError()またはその他の例外ステートメントを使用することは意味がありますか?

4

2 に答える 2

1

MFCを使用してダイアログを作成している場合は、何かをスローした場合にのみ、CException派生オブジェクトへのポインターをスローする必要があります。これは、DoModal関数に重要なアプリケーションの状態を復元するためのキャッチと、それに続く再スローが含まれているためです。他の種類の例外をスローすると、それが見逃され、アプリケーションがハングします。

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()にボタンをクリックすると、イベントループがクラッシュします。

-blockでラップすることもできますがQApplication::exec()try例外をキャッチすると、GUIはすでに破棄されている可能性が高いため、例外から回復する実際の可能性はありません。

例外安全性に関するQtドキュメントもご覧ください。

于 2012-09-02T15:21:22.260 に答える