例外処理 : 古いコードの変換
これは高度なトピックです。
この記事では、Microsoft Foundation Class マクロ ——TRY、CATCH、THROWなどで記述された既存のコードを変換して、C++ 例外処理キーワード 、 を使用する方法について catch 説明します throw 。 取り上げるトピックは次のとおりです。
変換の利点
MFC バージョン 3.0 のマクロ実装と以前のバージョンの実装の違いを認識する必要があるが、既存のコードを変換する必要はおそらくない。 これらの違いおよびコード動作の後続の変更については、「例外: バージョン 3.0の例外マクロの変更」で説明します。
変換の主な利点は次のとおりです。
C++ 例外処理キーワードを使用するコードは、少し小さい値または.EXEコンパイル.DLL。
C++ 例外処理キーワードの方が汎用性が高い: コピーできる任意のデータ型 (、 など) の例外を処理できるのに対し、マクロでは、その例外を処理できるのは、クラスとそこから派生したクラスのみです。
intfloatcharCException
マクロとキーワードの主な違いは、マクロを使用するコードは、例外がスコープ外になったときにキャッチされた例外を "自動的に" 削除する点です。 キーワードを使用するコードではそうではないので、キャッチされた例外を明示的に削除する必要があります。 詳細については、「例外: 例外 のキャッチと削除」を参照してください。
もう 1 つの違いは構文です。 マクロとキーワードの構文は、次の 3 つの点で異なります。
マクロ引数と例外宣言:
CATCH マクロ呼び出しの構文は次のとおりです。
CATCH(exception_class,exception_object_pointer_name)
クラス名とオブジェクト ポインター名の間のコンマに注意してください。
キーワードの例外宣言では
catch、次の構文が使用されます。catch(exception_type exception_name)
この例外宣言ステートメントは、catch ブロックが処理する例外の種類を示します。
catch ブロックの区切り:
マクロでは 、CATCH マクロ (引数を含む) が最初の catch ブロックを開始します。この AND_CATCH は後続の catch ブロックを開始し、END_CATCH は catch ブロックのシーケンスを終了します。
キーワードを使用すると、キーワード (例外宣言を含
catchむ) が各 catch ブロックを開始します。 このマクロに対応 END_CATCH はありません。catch ブロックは、終わりの中かっこで終わります。throw 式:
マクロ では、THROW_LAST を使用して、現在の例外を再スローします。 引数
throwを指定したキーワードは、同じ効果を持っています。
変換の実行
マクロを使用してコードを変換して C++ 例外処理キーワードを使用するには
MFC マクロ TRY、CATCH、AND_CATCH、およびEND_CATCHのすべての出現箇所を検索THROW_LAST。
次のマクロのすべての出現箇所を置換または削除します。
TRY (これを に置き換える )
CATCH (を に置き換える )
AND_CATCH (を に置き換える )
END_CATCH (削除)
THROW (を に置き換える )
THROW_LAST (を に置き換える )
マクロ引数を変更して、有効な例外宣言を形成します。
たとえば、
CATCH(CException, e)to
catch (CException* e)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++ 例外の 使用」を参照してください。