COM+ でのエラー処理の戦略

このトピックでは、COM+ のコンポーネントを開発する際に留意すべきいくつかのエラー処理戦略について説明します。

  • すべてのコンポーネント インターフェイス内のすべてのメソッドの HRESULT 値を返します。  COM+ では、 HRESULT 値を使用して、関数呼び出しまたはインターフェイス メソッド呼び出しを行う際のエラーを報告します。 HRESULT は、メソッドが成功したか失敗したかを示し、インターフェイス固有のエラーの RPC、WIN32、ITF など、エラーに関連付けられている機能を識別します。 また、システム API は、 HRESULT からエラー条件を記述する文字列への参照を提供します。 HRESULT 値を返すメソッドの使用は、適切に記述されたコンポーネントの基本であり、デバッグ プロセスに不可欠です。 Microsoft Visual Basic では、 HRESULT を戻り値として持つ各メソッドが自動的に定義されます。 Microsoft Visual C++ では、 HRESULTを明示的に返す必要があります。 HRESULT の詳細については、「COM エラー コードの構造」を参照してください。

  • 開発ツールが提供する任意の方法で ErrorInfo コレクション オブジェクトを開始します。ErrorInfo コレクション オブジェクトは、多くの場合、COM 例外と呼ばれます。これは、アパートメントの境界を越えてでも、オブジェクトが呼び出し元に豊富なエラー情報を渡す (またはスローする) ためです。 この汎用エラー オブジェクトの値は、HRESULT を補完し、呼び出し元に返すことができるエラー情報の種類を拡張することです。 各 ErrorInfo コレクション オブジェクトは、コンテキストの説明、エラーのソース、およびエラーを発生させたメソッドのインターフェイス識別子を返します。 ヘルプ ファイルにエントリへのポインターを含めることもできます。 オートメーションには、エラー オブジェクトを管理するための 3 つのインターフェイスが用意されています。 ErrorInfo コレクションのサポートをアドバタイズするには、コンポーネントで ISupportErrorInfo オートメーション インターフェイスを実装する必要があります。 エラーが発生すると、コンポーネントは ICreateErrorInfo オートメーション インターフェイスを使用してエラー オブジェクトを初期化します。 呼び出し元が HRESULT を検査し、メソッド呼び出しが失敗したことを検出した後、オブジェクトに対してクエリを実行して、 ErrorInfo コレクションがサポートされているかどうかを確認します。 その場合、呼び出し元は IErrorInfo Automation インターフェイスを使用してエラー情報を取得します。 Visual Basic プログラマは、Err オブジェクトを 介して公開される ErrorInfo コレクション オブジェクトに簡単にアクセスできます。 Err Raise 関数でエラーを発生させ、 On Error ステートメントでエラーをキャッチできます。 Visual Basic ランタイム レイヤーは、マッピングを自動的に処理します。 Visual C++ COM コンパイラ サポートを使用している場合は、_com_raise_error クラスを使用してエラーを報告し、_com_error クラスを使用してエラー情報を取得できます。 COM+ は、拡張 IErrorInfo 情報として従来の C++ 例外を伝達しません。 ErrorInfo コレクション オブジェクトの詳細については、オートメーション ガイドの「エラー処理」を参照してください。

    Note

    COM では、すべての ErrorInfo コレクション オブジェクトを値でマーシャリングする必要があります。これは、 IErrorInfo オートメーション インターフェイスを実装するコンポーネントも IMarshal インターフェイスを実装してサポートする必要があることを意味します。 IMarshal インターフェイスの実装では、コンポーネントの値によるマーシャリングをサポートする必要があります。

     

  • トランザクションを使用して共有リソースの障害を管理します。 自動トランザクションにより、状態管理リソース マネージャーを使用するときに記述する必要があるエラー処理コードの量が大幅に削減される可能性があります。 ただし、トランザクションによってエラー処理の必要性が完全に排除されるわけではありません。 引き続きインターフェイス メソッドからエラー コードを返し、呼び出し元内でそれらのエラー コードをチェックして、運命のトランザクションに対して不要な作業を行わないようにする必要があります。 エラー処理とトランザクション処理の組み合わせの詳細については、「ルート オブジェクトに通知してトランザクションを高速化する」を参照してください。

  • エラーを明示的に発生させます。 オブジェクトが明示的にエラーを発生させる場合を除き、エラー情報をオブジェクトから残さないようにします。 ツールによって生成されたすべてのエラーをキャッチし、コンポーネント コードで処理します。 少なくとも、予期しないエラーを一貫した方法で報告する標準ハンドラーを含めます。

  • インターフェイス固有のエラーを報告するには、FACILITY_ITFのエラー範囲を使用します。 インターフェイス固有のエラーは、0x0200と0xFFFFの間のエラーのFACILITY_ITF範囲内にある必要があります。 Visual Basic では、vbObjectError からのオフセットとしてカスタム エラー コードを定義できます。 次の例に示すように、C++ の MAKE_HRESULT マクロを使用して、インターフェイス固有のエラー コードを導入します。

    const HRESULT ERROR_NUMBER = MAKE_HRESULT (SEVERITY_ERROR, FACILITY_ITF, 10);
    

障害の分離とフェールファスト ポリシー

エラーの原因を見つける

COM+ が戻り値を変更する方法

エラー コードの解釈

トラブルシューティング