バインド ハンドルの使用と RPC 呼び出しの実行
RPC プログラマの間でよくある間違いは、すべての例外を処理することです。 多くのプログラマは、次のように例外ハンドルを構成します。
RpcTryExcept
{
RemoteSample();
}
RpcExcept(1)
{
log an error or do something else
}
RpcEndExcept
このハンドラーの問題は、クライアント プログラムのエラーを含むすべてのエラーをキャッチすることです。 クライアント プログラムでエラーをキャッチすると、デバッグがより困難になります。 例外ハンドラーを構成する適切な方法は次のとおりです。
RpcTryExcept
{
RemoteSample();
}
// Return "non-fatal" errors to clients. Catching fatal errors
// makes it harder to debug.
RpcExcept( ( ( (RpcExceptionCode() != STATUS_ACCESS_VIOLATION) &&
(RpcExceptionCode() != STATUS_POSSIBLE_DEADLOCK) &&
(RpcExceptionCode() != STATUS_INSTRUCTION_MISALIGNMENT) &&
(RpcExceptionCode() != STATUS_DATATYPE_MISALIGNMENT) &&
(RpcExceptionCode() != STATUS_PRIVILEGED_INSTRUCTION) &&
(RpcExceptionCode() != STATUS_ILLEGAL_INSTRUCTION) &&
(RpcExceptionCode() != STATUS_BREAKPOINT) &&
(RpcExceptionCode() != STATUS_STACK_OVERFLOW) &&
(RpcExceptionCode() != STATUS_HANDLE_NOT_CLOSABLE) &&
(RpcExceptionCode() != STATUS_IN_PAGE_ERROR) &&
(RpcExceptionCode() != STATUS_ASSERTION_FAILURE) &&
(RpcExceptionCode() != STATUS_STACK_BUFFER_OVERRUN) &&
(RpcExceptionCode() != STATUS_GUARD_PAGE_VIOLATION)
)
? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH ) )
{
log an error or do something else
}
RpcEndExcept
この例外ハンドラーには、特定の範囲のエラーを通過させるという利点があります。 これらのエラーは、クライアント側の問題を示しているため、サーバーから返されることはありません。
さらに、[strict_context_handle] 属性と [type_strict_context_handle] 属性を使用して、RPC ランタイムによって、そのインターフェイスのメソッドにのみ引数として渡すことができるコンテキスト ハンドルが 1 つのインターフェイスに作成されるようにすることをお勧めします。 これにより、同じプロセス内に存在する異なるインターフェイス間でコンテキスト ハンドルが開かれて渡されたときに発生するサーバー エラーを防ぐことができます。
関連トピック