Qtをメインに、プログラムやITに関する情報を発信

Qtの戯言

デバッグ

Qtで全ての例外を try-catch する方法

投稿日:

デフォルトでは全ての例外をcatchできない

QtというよりVisual Studioの仕様になるのですが、デフォルトではNULLポインタアクセスや0除算などで発生する例外を、try-catchすることができません。

char *p = nullptr;
try {
    qDebug() << "try";
    *p = 'A';
}
catch (...) {
    qDebug() << "catch";
}
try
00:48:59: プログラムが突然終了しました。
00:48:59: The process was ended forcefully.

 

qmakeにて生成されたMakefileを見てみると、-EHscオプションが付いています。
ここによると、

/EHs または /EHscを使用すると、 catch(...) 句では非同期構造化例外がキャッチされません。

とのこと。

構造化例外とは、ハードウェア例外を含むシステム的な例外のことで、WindowsではSEH(Structured Exception Handling=構造化例外処理)という仕組みが提供されています。
デフォルトでは、それらがキャッチされないということですね。

 

キャッチするには

プロジェクトファイル(*.pro)に、以下の4行を追加します。
ビルド前に、qmakeを実行してMakefileを再生成するのを忘れないようにして下さい。

win* {
    QMAKE_CXXFLAGS_EXCEPTIONS_ON = /EHa
    QMAKE_CXXFLAGS_STL_ON = /EHa
}

 

再生成されたMakefileを確認すると、-EHscの代わりに、プロジェクトファイルで指定した/EHaが付いています。

この状態で、先のプログラムを実行すると、キャッチできていることが分かります。

try
catch

 

-デバッグ
-, ,

Copyright© Qtの戯言 , 2020 All Rights Reserved Powered by STINGER.