備忘録

備忘録

C++ で全ての例外を try catch 出来るようにする方法

Ⅰ. はじめに

Visual Studioのデフォルト設定ではWindowsが発行する「システム的な例外」を捉えることはできません。

  • 無効なメモリアドレスへのアクセス
  • 0での割り算

等が「システム的な例外」に該当します。

また、「『システム的な例外』をプログラム上で扱う事」を構造化例外処理(SEH: Structured Exception Handling)といいます。
SEH は Windows のみで有効です。

Ⅱ. やり方

1. プロジェクトのプロパティを開く

2. 構成プロパティ → C/C++ → コード生成

C++ の例外を有効にする」を「はい - SEH 例外あり(/EHa)」に変更する。

f:id:kagasu:20170504223041p:plain

3. メモリアクセス違反が発生するサンプルプログラムを実行する

#include <iostream>

using namespace std;

int main()
{
  try
  {
    *(int *)0 = 0;
  }
  catch (...)
  {
    cout << "catch exception" << endl;
  }

  return 0;
}

実行結果

f:id:kagasu:20170504223215p:plain