次の方法で共有


例外処理 : 古いコードの変換

これは、高度なトピックです。

この技術情報では、 C++ の例外処理キーワード trycatchと throwを使用するように Microsoft Foundation Class のマクロ — TryCatchTHROW記述された既存のコードを変換する方法など )について説明します。ここでは、次の内容について説明します。

  • 変換の長所

  • 例外処理マクロのコードで C++ 例外を使用するように変換

変換の長所

MFC バージョン 3.0 のマクロ実装と旧バージョンの実装の違いに注意する必要がありますが、既存のコードを変換する必要はありません。コード実行のこれらの違いとそれ以降の変更は 例外: バージョン 3.0 の例外マクロへの変更で説明します。

変換の主な長所は次のとおりです:

  • コードをわずかにより小さい .EXE または .DLL に対して C++ 例外処理キーワードをコンパイルして使用する。

  • C++ 例外処理キーワードは、さまざまな用途に使用されます: インターフェイスはクラスの CException のみマクロの例外処理およびクラスは、から派生した一方、 (int、 浮動小数点型、 charなど)をコピーできる任意のデータ型の例外処理できます。

マクロとキーワードとの主な相違点は例外がスコープ外に出るとマクロを使用してコードが 「自動的に」キャッチした例外を削除します。キーワードを使用してコードはため、明示的にキャッチした例外を削除します。詳細については、技術情報 例外: 例外をキャッチし、削除しますを参照してください。

もう一つの違いは、構文です。マクロとキーワードの構文は、 3 種類のとおりです。:

  1. マクロ引数と例外宣言:

    Catch のマクロ呼び出し、次の構文があります:

    CATCH(exception_classexception_object_pointer_name)

    クラス名とオブジェクト ポインターの名前との間のカンマに注意してください。

    catch のキーワードの例外宣言は、この構文を使用して:

    catch(exception_typeexception_name)

    この例外宣言ステートメントで例外の種類を catch ブロックのハンドル示します。

  2. catch ブロックの制限:

    マクロによって、 Catch のマクロ (引数を使用)最初の catch ブロックを開始します; AND_CATCH のマクロは、その後に続く catch ブロックを開始し、 END_CATCH のマクロ、 catch ブロックのシーケンスを終了します。

    キーワードによって、 catch のキーワードは、例外宣言の場合)各 catch ブロックを開始します。対応 END_CATCH 側のマクロはありません; 右中かっこを持つ catch ブロックの最後。

  3. スローの式:

    マクロが再スローに THROW_LAST を現在の例外使用します。throw のキーワードは、引数なし、同じ効果があります。

変換が行われます。

コードを C++ 例外処理キーワードを使用するマクロを使って変換するには

  1. MFC のマクロ TryCatchAND_CATCHEND_CATCHTHROWTHROW_LASTのすべての出現箇所を検索します。

  2. 次のマクロのすべての一致を置き換えるか、または削除します:

    Try ( tryに置き換えます。)

    Catch ( catchに置き換えます。)

    AND_CATCH ( catchに置き換えます。)

    END_CATCH 削除 (、)

    THROW ( throwに置き換えます。)

    THROW_LAST ( throwに置き換えます。)

  3. 有効な例外宣言を形成するように、マクロ引数を変更します。

    たとえば、変更します。

    CATCH(CException, e)
    

    これを次のように書き換えます。

    catch(CException* e)
    
  4. 必要に応じて例外オブジェクトを削除するように catch ブロックのコードを変更します。詳細については、技術情報 例外: 例外をキャッチし、削除しますを参照してください。

例外処理コードの例は、マクロ ベースの例外処理を使用して次に示します。次の例のコードでマクロを使用するため、例外 e は自動的に削除されることに注意してください:

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   if (m_bPassExceptionsUp)
      THROW_LAST();

   if (m_bReturnFromThisFunction)
      return;

   // Not necessary to delete the exception e.
}
END_CATCH

次の例のコードは、 C++ 例外のキーワードを使用するため、例外を明示的に削除する必要があります:

try
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
catch(CException* e)
{
   if (m_bPassExceptionsUp)
      throw;

   if (m_bThrowDifferentException)
   {
      e->Delete();
      throw new CMyOtherException;
   }

   if (m_bReturnFromThisFunction)
   {
      e->Delete();
      return;
   }

   e->Delete();
}

詳細については、 例外: MFC マクロと C++ の例外を使用するを参照してください。

参照

概念

例外処理 (MFC)