Qtの基礎 - 例外処理

提供:MochiuWiki : SUSE, EC, PCB
2021年2月15日 (月) 14:03時点におけるWiki (トーク | 投稿記録)による版 (ページの作成:「== 概要 == <br><br> == 全ての例外をキャッチする方法 == 標準の設定では、NULLポインタのアクセスや0除算等で発生する例外をキ…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

概要



全ての例外をキャッチする方法

標準の設定では、NULLポインタのアクセスや0除算等で発生する例外をキャッチすることができない。

 char *p = nullptr;
 try
 {
    qDebug() << "try";
    *p = 'A';
 }
 catch(...)
 {
    qDebug() << "catch";
 }


qmakeで生成されたMakefileを見ると、-EHscオプションが付加されている。
/EHsまたは/EHscを使用する場合、catch句では、非同期構造化例外がキャッチされない。

構造化例外とは、ハードウェア例外を含むシステム的な例外のことで、
Windowsでは、SEH(Structured Exception Handling : 構造化例外処理)という仕組みが提供されている。

全ての例外をキャッチするには、プロジェクトファイル(.pro)に、以下の設定を追記する。

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

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


ビルドして生成されたMakefileには、上記で設定した-EHaオプションが付加される。
この状態で、上記のサンプルコードを実行すると、例外をキャッチすることができる。