次の方法で共有


System.Runtime.InteropServices.COMException クラス

この記事では、この API のリファレンス ドキュメントに補足的な解説を提供します。

COMException クラスは、認識できない HRESULT が COM メソッド呼び出しから返されたときにスローされる例外です。

共通言語ランタイムは、既知の HRESULT を .NET 例外に変換し、COM オブジェクトがマネージド クライアントに意味のあるエラー情報を返すようにします。 HRESULT から例外へのマッピングは、アンマネージ クライアントに特定の HRESULT を返すことによって、他の方向にも機能します。 マッピングの詳細については、 HRESULT と例外をマップする方法を参照してください。

ランタイムは、未知の HRESULT (特定の対応する例外がない HRESULT) を検出すると、 COMException クラスのインスタンスをスローします。 この万能例外は、例外と同じメンバーを公開し、呼び出し先から返された HRESULT を含むパブリック ErrorCode プロパティを継承します。 ランタイムでエラー メッセージが使用可能な場合 (Visual Basic の IErrorInfo インターフェイスまたは Err オブジェクトから取得した場合、またはオペレーティング システムから取得した場合)、メッセージは呼び出し元に返されます。 ただし、COM コンポーネント開発者がエラー メッセージを含めなければ、ランタイムはメッセージ文字列の代わりに 8 桁の HRESULT を返します。 HRESULT を使用すると、呼び出し元はジェネリック例外の原因を特定できます。

COMException 例外を処理する

COMException例外のトラブルシューティングに関するいくつかの考慮事項を次に示します。

ErrorCodeプロパティを確認します。ランタイムが未知の HRESULT を検出し、COMException例外をスローすると、ErrorCode プロパティにはエラー メッセージが含まれます。エラー メッセージが使用できない場合は、8 桁の HRESULT 値が含まれます。 エラー メッセージまたは HRESULT 値は、例外の原因を特定するのに役立ちます。

HRESULT 値の一覧については、「 共通 HRESULT 値」を参照してください。

遅延バインディング引数を Microsoft Office オブジェクトのメソッドに渡すと、オブジェクトが COM オブジェクトの場合、 COMException 例外がスローされることがあります。 遅延バインダーは、このようなメソッド呼び出しには ByRef パラメーターが含まれており、渡すプロパティに set アクセサーがあることを前提としています。 このプロパティがない場合、.NET は (CORE_E_MISSINGMETHOD HRESULT を使用して) MissingMethodException例外を生成します。 この動作を回避するには、事前バインドされたオブジェクトを使用するか、オブジェクトのプロパティではなく変数を渡します。

COM は、Visual Studio と ホスティング プロセス間の通信に使用されます。 コードの実行前に使用されるため、 CoInitializeSecurity を呼び出すと、この例外がスローされます。 場合によっては、管理者として Visual Studio を実行すると問題が解決することがあります。 ホスティング プロセスを無効にすることもできます。

COMException 例外をスローする

COMException クラスを使用して、アンマネージ クライアントに特定の HRESULT を返すことができますが、特定の .NET 例外をスローする方が、ジェネリック例外を使用するよりも優れています。 マネージド クライアントとアンマネージド クライアントは .NET オブジェクトを使用でき、マネージド呼び出し元に HRESULT をスローすることは、例外をスローするよりも理解しにくいと考えてください。