次の方法で共有


エラー処理と戻り値

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_OKSetErrorInfo メソッドを呼び出す必要があります。 そうしないと、別のパーティが独自の ErrorInfo を提供せずに、エラーを生成するときに、ErrorInfo オブジェクトが誤って使用されることがあり ます。

  • HRESULT エラーを生成するすべてのメソッドでは、SetErrorInfo メソッドを呼び出して、豊富なエラー情報を提供することが推奨されます。 返された HRESULT が特殊な FACILITY_ITF エラーである場合、メソッドは適切な ErrorInfo オブジェクトを提供するために必要です。 返されたエラーが標準システム エラー (E_OUTOFMEMORYE_ABORTE_INVALIDARGE_UNEXPECTED など) の場合は、SetErrorInfo メソッドを明示的に呼び出すことなく、エラー コードを返すことができます。 防御的なコーディング方法として、エラー HRESULT (システム エラーを含む) を生成する場合は、エラーを詳細に説明する ErrorInfo か、または null を使用して、常に SetErrorInfo メソッドを呼び出します。

  • 別の呼び出しによって生成されたエラーを返すすべての関数は、ErrorInfo オブジェクトを変更せずに、失敗した呼び出しから受け取った情報を HRESULT で渡す必要があります。

関連項目