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

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

この記事では、Microsoft Foundation Class マクロ ——TRY、CATCH、THROWなどで記述された既存のコードを変換して、C++ 例外処理キーワード 、 を使用する方法について catch 説明します throw 。 取り上げるトピックは次のとおりです。

変換の利点

MFC バージョン 3.0 のマクロ実装と以前のバージョンの実装の違いを認識する必要があるが、既存のコードを変換する必要はおそらくない。 これらの違いおよびコード動作の後続の変更については、「例外: バージョン 3.0の例外マクロの変更」で説明します。

変換の主な利点は次のとおりです。

  • C++ 例外処理キーワードを使用するコードは、少し小さい値または.EXEコンパイル.DLL。

  • C++ 例外処理キーワードの方が汎用性が高い: コピーできる任意のデータ型 (、 など) の例外を処理できるのに対し、マクロでは、その例外を処理できるのは、クラスとそこから派生したクラスのみです。 intfloatcharCException

マクロとキーワードの主な違いは、マクロを使用するコードは、例外がスコープ外になったときにキャッチされた例外を "自動的に" 削除する点です。 キーワードを使用するコードではそうではないので、キャッチされた例外を明示的に削除する必要があります。 詳細については、「例外: 例外 のキャッチと削除」を参照してください

もう 1 つの違いは構文です。 マクロとキーワードの構文は、次の 3 つの点で異なります。

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

    CATCH マクロ呼び出しの構文は次のとおりです。

    CATCH(exception_class,exception_object_pointer_name)

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

    キーワードの例外宣言では catch 、次の構文が使用されます。

    catch(exception_type exception_name)

    この例外宣言ステートメントは、catch ブロックが処理する例外の種類を示します。

  2. catch ブロックの区切り:

    マクロでは 、CATCH マクロ (引数を含む) が最初の catch ブロックを開始します。この AND_CATCH は後続の catch ブロックを開始し、END_CATCH catch ブロックのシーケンスを終了します。

    キーワードを使用すると、キーワード (例外宣言を含 catch む) が各 catch ブロックを開始します。 このマクロに対応 END_CATCH はありません。catch ブロックは、終わりの中かっこで終わります。

  3. throw 式:

    マクロ では、THROW_LAST を使用して、現在の例外を再スローします。 引数 throw を指定したキーワードは、同じ効果を持っています。

変換の実行

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

  1. MFC マクロ TRY、CATCH、AND_CATCH、およびEND_CATCHのすべての出現箇所検索THROW_LAST。

  2. 次のマクロのすべての出現箇所を置換または削除します。

    TRY (これを に置き換える )

    CATCH (を に置き換える )

    AND_CATCH (を に置き換える )

    END_CATCH (削除)

    THROW (を に置き換える )

    THROW_LAST (を に置き換える )

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

    たとえば、

    CATCH(CException, e)
    

    to

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

MFC 例外マクロを使用した例外処理コードの例を次に示します。 次の例のコードでは マクロが使用されています。この例外は自動的 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++ 例外の 使用」を参照してください

関連項目

例外処理