エラー処理と戻り値
Vspackage と COM では、エラーに同じアーキテクチャが使用されています。 SetErrorInfo
関数と GetErrorInfo
関数は、Win32 アプリケーション プログラミング インターフェイス (API) の一部です。 統合開発環境 (IDE) のすべての VSPackage では、これらのグローバル Win32 API を呼び出して、エラー通知を受け取ったときに豊富なエラー情報を記録できます。 Visual Studio SDK には、エラー情報を管理するための相互運用機能アセンブリが用意されています。
相互運用機能メソッド
便宜上、IDE には、Win32 API を呼び出す代わりに使用するメソッド SetErrorInfo が用意されています。 マネージド コードで SetErrorInfo を使用します。 エラー メッセージを表示する必要があるレベルでエラー HRESULT
が到着すると (これは多くの場合、IOleCommandTarget コマンド ハンドラーを実装しているオブジェクトです)、IDE では別のメソッド ReportErrorInfo を使用して、適切なメッセージ ボックスが表示されます。 マネージド コードで ReportErrorInfo メソッドを使用します。
VSPackage の実装者として、COM オブジェクトによって、通常 ISupportErrorInfo
が実装されます。 ISupportErrorInfo
インターフェイスにより、豊富なエラー情報を呼び出しチェーンの上方に移動させることができます。 プロセス間またはスレッド間で使用される可能性のあるオブジェクトでは ISupportErrorInfo
をサポートし、豊富なエラー情報が呼び出し元に正しくマーシャリングされるようにする必要があります。
エディター ファクトリ、エディター、階層、提供されているサービスなど、VSPackage に関連し、IDE の拡張に関係するすべてのオブジェクトで、豊富なエラー情報をサポートしている必要があります。 IDE では、ISupportErrorInfo
を実装するために、これらの VSPackage オブジェクトを実装している必要はありませんが、常に推奨されます。
IDE には、HRESULT
が IDE に伝達されるたびに、エラー情報をレポートして、Visual Studio のユーザーに表示する役割があります。 さらに IDE は、ErrorInfo
オブジェクトを作成するためのメカニズムでもあります。
一般的なガイドライン
SetErrorInfo メソッドと ReportErrorInfo メソッドを使用して、VSPackage 実装の内部のエラーを設定し、報告することもできます。 ただし、原則として、VSPackage でエラー メッセージを処理する場合は、次のガイドラインに従ってください。
VSPackage COM オブジェクトに
ISupportErrorInfo
を実装します。IOleCommandTarget を実装するオブジェクトで SetErrorInfo メソッドを呼び出すエラー報告メカニズムを作成します。
ReportErrorInfo メソッドによって、IDE で、ユーザーにエラーを表示させます。
IDE のエラー情報
次の規則は、Visual Studio IDE でのエラー情報の処理方法を示しています。
古いエラー情報が確実にユーザーに報告されないようにするための防御戦略として、ReportErrorInfo メソッドを呼び出す関数では、最初に SetErrorInfo メソッドを呼び出す必要があります。 新しいエラー情報を設定する可能性のあるものを呼び出す前に、
null
を渡して、キャッシュされたエラー メッセージをクリアします。エラー メッセージを直接報告しない関数では、エラー
HRESULT
を返す場合に SetErrorInfo メソッドを呼び出すことのみが許可されます。 関数に入るとき、または S_OK を返すときに、ErrorInfo
をクリアすることができます。 この規則の唯一の例外は、受信パーティが明示的に回復できるか、または安全に無視できるエラーHRESULT
を、呼び出しが返す場合です。エラー
HRESULT
を明示的に無視するすべてのパーティは、S_OK で SetErrorInfo メソッドを呼び出す必要があります。 そうしないと、別のパーティが独自のErrorInfo
を提供せずに、エラーを生成するときに、ErrorInfo
オブジェクトが誤って使用されることがあり ます。HRESULT
エラーを生成するすべてのメソッドでは、SetErrorInfo メソッドを呼び出して、豊富なエラー情報を提供することが推奨されます。 返されたHRESULT
が特殊なFACILITY_ITF
エラーである場合、メソッドは適切なErrorInfo
オブジェクトを提供するために必要です。 返されたエラーが標準システム エラー (E_OUTOFMEMORY、E_ABORT、E_INVALIDARG、E_UNEXPECTED など) の場合は、SetErrorInfo メソッドを明示的に呼び出すことなく、エラー コードを返すことができます。 防御的なコーディング方法として、エラーHRESULT
(システム エラーを含む) を生成する場合は、エラーを詳細に説明するErrorInfo
か、またはnull
を使用して、常に SetErrorInfo メソッドを呼び出します。別の呼び出しによって生成されたエラーを返すすべての関数は、
ErrorInfo
オブジェクトを変更せずに、失敗した呼び出しから受け取った情報をHRESULT
で渡す必要があります。