例外処理 : 古いコードの変換
これは、高度なトピックです。
この技術情報では、 C++ の例外処理キーワード try、 catchと throwを使用するように Microsoft Foundation Class のマクロ — Try、 Catch、 THROW記述された既存のコードを変換する方法など )について説明します。ここでは、次の内容について説明します。
変換の長所
例外処理マクロのコードで C++ 例外を使用するように変換
変換の長所
MFC バージョン 3.0 のマクロ実装と旧バージョンの実装の違いに注意する必要がありますが、既存のコードを変換する必要はありません。コード実行のこれらの違いとそれ以降の変更は 例外: バージョン 3.0 の例外マクロへの変更で説明します。
変換の主な長所は次のとおりです:
コードをわずかにより小さい .EXE または .DLL に対して C++ 例外処理キーワードをコンパイルして使用する。
C++ 例外処理キーワードは、さまざまな用途に使用されます: インターフェイスはクラスの CException のみマクロの例外処理およびクラスは、から派生した一方、 (int、 浮動小数点型、 charなど)をコピーできる任意のデータ型の例外処理できます。
マクロとキーワードとの主な相違点は例外がスコープ外に出るとマクロを使用してコードが 「自動的に」キャッチした例外を削除します。キーワードを使用してコードはため、明示的にキャッチした例外を削除します。詳細については、技術情報 例外: 例外をキャッチし、削除しますを参照してください。
もう一つの違いは、構文です。マクロとキーワードの構文は、 3 種類のとおりです。:
マクロ引数と例外宣言:
Catch のマクロ呼び出し、次の構文があります:
CATCH(のexception_class、 exception_object_pointer_name)
クラス名とオブジェクト ポインターの名前との間のカンマに注意してください。
catch のキーワードの例外宣言は、この構文を使用して:
catch(のexception_typeexception_name)
この例外宣言ステートメントで例外の種類を catch ブロックのハンドル示します。
catch ブロックの制限:
マクロによって、 Catch のマクロ (引数を使用)最初の catch ブロックを開始します; AND_CATCH のマクロは、その後に続く catch ブロックを開始し、 END_CATCH のマクロ、 catch ブロックのシーケンスを終了します。
キーワードによって、 catch のキーワードは、例外宣言の場合)各 catch ブロックを開始します。対応 END_CATCH 側のマクロはありません; 右中かっこを持つ catch ブロックの最後。
スローの式:
マクロが再スローに THROW_LAST を現在の例外使用します。throw のキーワードは、引数なし、同じ効果があります。
変換が行われます。
コードを C++ 例外処理キーワードを使用するマクロを使って変換するには
MFC のマクロ Try、 Catch、 AND_CATCH、 END_CATCH、 THROWと THROW_LASTのすべての出現箇所を検索します。
次のマクロのすべての一致を置き換えるか、または削除します:
Try ( tryに置き換えます。)
Catch ( catchに置き換えます。)
AND_CATCH ( catchに置き換えます。)
END_CATCH 削除 (、)
THROW ( throwに置き換えます。)
THROW_LAST ( throwに置き換えます。)
有効な例外宣言を形成するように、マクロ引数を変更します。
たとえば、変更します。
CATCH(CException, e)
これを次のように書き換えます。
catch(CException* e)
必要に応じて例外オブジェクトを削除するように 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++ の例外を使用するを参照してください。