例外によってエラーを示す

従来の 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 に戻る前に例外をスローする必要があります。

例外処理