例外によってエラーを示す
従来の C プログラマの場合、エラーは通常、戻り値またはエラー コードを返す特別な [out] パラメーターを使用して返されます。 これにより、インターフェイスは次のように実装されます。
long sample(...)
{
...
p = new Cbar(...);
if (p == NULL)
{
// cleanup
...
return ERROR_OUTOFMEMORY;
}
}
この方法の問題は、RPC の戻り値が単に長整数であるということです。 エラーとして特別な意味を持つものはありません ( error_status_t にはサーバー側に特別なセマンティクスがないことに注意してください)。これは重要な意味を持ちます。
最初に、RPC は操作が失敗したことを警告しません。すべての [in, out] 引数と [out] 引数のマーシャリングを解除しようとします。 コンテキスト ハンドルのエラー セマンティクスも異なります。 クライアントに返されるパケットは、本質的に成功パケットであり、エラー コードはパケットの深部に埋め込まれます。 つまり、RPC では拡張エラー情報が使用されないため、多くの場合、クライアント ソフトウェアは呼び出しが失敗した場所を識別できません。
(C++ではなく) 構造化例外処理 (SEH) 例外をスローして RPC サーバー ルーチンのエラーを示す方が、はるかに優れた方法です。 SEH 例外がスローされると、制御は RPC ランタイムに直接移動します。 エラーは、正常にクリーンできないルーチンの深部で発生する場合があり、呼び出し元にエラーを示す必要があります。 ルーチンは呼び出し元にエラーを返す必要があります。これにより、呼び出し元にエラーが返される可能性があります。 ただし、スタック上の最後のサーバー ルーチンは、エラーが発生したことを RPC に示すために RPC に戻る前に例外をスローする必要があります。
関連トピック