次の方法で共有


例外処理の違い

構造化例外処理と C++ 例外処理との主な相違点は 1 種類の例外を除き C の構造化例外処理モデルを扱う。つまりunsigned int と C++ 例外処理モデルが型で処理することです。つまりC の例外は符号なし整数値で C++ 例外がデータ型で識別される場合識別されます。例外が C に発生するとそれぞれの可能なハンドラーは例外を受け取るための C の例外コンテキストを調べているかどうかを確認またはそのほかのハンドラーに渡す無視フィルターを実行します。C++ で例外がスローされると任意の型である場合があります。

2 番目の相違点は例外がコントロールの流れに実行されると 15 番 C の構造化例外処理モデルが非同期 「」と呼ばれることです。C++ 例外処理機構は完全に 「同期が発生したことを」例外がスローされる場合にのみ意味します。

C. の例外が C++ でのプログラムである場合例外のコンテキストに動的により近いは一切関連フィルターを使用して構造化例外ハンドラーまたは C. Catch 例外ハンドラーによって処理できます。たとえば次の C++ プログラムは. Try C++ のコンテキスト内の C. で例外が発生します :

使用例

// exceptions_Exception_Handling_Differences.cpp
// compile with: /EHa
#include <iostream>

using namespace std;
void SEHFunc( void );

int main() {
   try {
      SEHFunc();
   }
   catch( ... ) {
      cout << "Caught a C exception."<< endl;
   }
}

void SEHFunc() {
   __try {
      int x, y = 0;
      x = 5 / y;
   }
   __finally {
      cout << "In finally." << endl;
   }
}
  
  

たとえば次のコードはカスタム移動の関数をインストールしSE_Exception のクラスによってラップする C. で例外が発生します :

// exceptions_Exception_Handling_Differences3.cpp
// compile with: /EHa
#include <stdio.h>
#include <eh.h>
#include <windows.h>

class SE_Exception {
private:
   SE_Exception() {}
   unsigned int nSE;

public:
   SE_Exception( SE_Exception& e) : nSE(e.nSE) {}
   SE_Exception(unsigned int n) : nSE(n) {}
   ~SE_Exception() {}
   unsigned int getSeNumber() { return nSE; }
};

void SEFunc() {
   __try {
      int x, y = 0;
      x = 5 / y;
    }
    __finally {
      printf_s( "In finally\n" );
   }
}

void trans_func( unsigned int u, _EXCEPTION_POINTERS* pExp ) {
   printf_s( "In trans_func.\n" );
   throw SE_Exception( u );
}

int main() {
   _set_se_translator( trans_func );
    try {
      SEFunc();
    }
    catch( SE_Exception e ) {
      printf_s( "Caught a __try exception with SE_Exception.\n" );
      printf_s( "nSE = 0x%x\n", e.getSeNumber() );
    }
}
  
  
  

C の例外のラッパー クラス

簡単な例では上C の例外 省略記号 () Catch ハンドラーによってのみキャッチできます。ことをお勧めします。例外の種類または特性に関する情報はハンドラーと伝達されるこのメソッドは作業中に各 C の例外が特定のクラスに関連付けること場合によっては 2 種類の例外処理モデル間の変換を定義する必要があります。これを行うにはC. の例外にクラス型を属性付きに使用または取得できる C. の例外 「ラッパー」クラスを定義できます。それにより各 C の例外は前の例では C ++. Catch ハンドラーによって個別に処理できます。

ラッパー クラスは例外の値を " C の例外モデルの拡張の例外コンテキスト情報にアクセスするメンバー関数で構成されるインターフェイスが含まれることがあります。またコピー コンストラクターがあります。既定のコンストラクターとコンストラクターの引数 unsigned int (基になる C の例外表現を提供するため) 含まれておりおよびビットごとに定義する。次は. の例外のラッパー クラスで実装されています :

// exceptions_Exception_Handling_Differences2.cpp
// compile with: /c
class SE_Exception {
private:
   SE_Exception() {}
   SE_Exception( SE_Exception& ) {}
   unsigned int nSE;
public:
   SE_Exception( unsigned int n ) : nSE( n ) {}
   ~SE_Exception() {}
   unsigned int getSeNumber() {
      return nSE;
   }
};

このクラスを使用するには内部例外処理機構を C. の例外によってスローされるというカスタム C の例外の移動の関数をインストールします。移動の関数の中で適切な一致 C++ Catch ハンドラーでキャッチできる SE_Exception から派生したクラス型) または指定された例外 (SE_Exception の型はをスローできます。示す例外を対処されていないの移動の関数は単に戻すことができます。移動の関数自体が C++. で例外が発生した場合は終了します。 が呼び出されます。

カスタム変換関数を指定する場合は単一の引数として移動の関数の名前で _set_se_translator の関数を呼び出します。作成した移動の関数は Try ブロックはスタックの関数の呼び出しに一度だけ呼び出されます。既定値を変換する関数がありません ; _set_se_translator を呼び出して1 を指定するC の例外は省略記号 Catch ハンドラーによってのみキャッチできません。

参照

関連項目

混合の C (構造化)と C++ 例外