C の __try、try/catch/finally を理解する
C では、通常、try/catch/finally ブロックが例外処理に使用されます。 。ただし、二重アンダースコアを使用した代替構文 __try があり、これは Windows に固有です。
__try を使用する場合
Windows では、例外処理は構造化メソッドによって実装されます。例外処理 (SEH)。 MSVC コンパイラで Windows をターゲットにする場合、__try 構文を使用して SEH 例外をキャッチできます。
SEH および C 例外
MSVC コンパイラは、C 例外をマップするコードを生成します。 SEH インフラストラクチャ、例外コード 0xe06d7363 (「msc」) を使用します。これにより、SEH 例外が発生したときに C デストラクターを呼び出すことができます。
デストラクターのコンパイラーの最適化
MSVC コンパイラーは、デストラクター コードが存在する場合にデストラクター コードの生成を回避するようにコードを最適化します。オブジェクトの有効期間内に throw ステートメントを使用しないでください。この最適化は、/EHa コンパイル オプションを使用することで抑制できます。これは、すべての SEH 例外を一貫してキャッチするために必要です。
SEH 例外の種類
SEH には多くの例外の種類があります。これには、オペレーティング システムによって定義されたものや、特定のアプリケーションによって使用されるものが含まれます。 .NET 例外などのマネージ例外では、例外コード 0xe0434f4d ("com") を使用します。
__try、__Except、および __finally
SEH 例外をキャッチするには、__try __excel と組み合わせて使用されます。これは C catch ブロックのように機能しますが、より多くの機能を備えています。 __finally を使用すると、例外処理後にコードを実行できます。
サンプル コード
提供されたコードは、両方の SEH 例外をキャッチするための __try、__excel、__finally の使用法を示しています。 (null ポインターへのアクセスによって引き起こされる) および C 例外 ( integer).
出力は、両方の例外に対してデストラクターが呼び出され、__Except が例外を正常にキャッチしたことを示しています。
以上がWindows 上の C での __try の目的と実装は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。