私はCMakeを使用してプロジェクトを作成しています。このプロジェクトでは、主にQtC++といくつかのMFC関数をハードウェアインターフェイスに使用しています。コードでtry/catch e-> ReportError()またはその他の例外ステートメントを使用することは意味がありますか?
2 に答える
MFCを使用してダイアログを作成している場合は、何かをスローした場合にのみ、CException派生オブジェクトへのポインターをスローする必要があります。これは、DoModal
関数に重要なアプリケーションの状態を復元するためのキャッチと、それに続く再スローが含まれているためです。他の種類の例外をスローすると、それが見逃され、アプリケーションがハングします。
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()
にボタンをクリックすると、イベントループがクラッシュします。
-blockでラップすることもできますがQApplication::exec()
、try
例外をキャッチすると、GUIはすでに破棄されている可能性が高いため、例外から回復する実際の可能性はありません。
例外安全性に関するQtドキュメントもご覧ください。