使用绑定句柄和进行 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 运行时在一个接口上创建上下文句柄,该接口只能作为参数传递给该接口的方法。 这样做可以防止在打开上下文句柄并在同一进程中存在的不同接口之间传递时发生的服务器故障。

strict_context_handle

type_strict_context_handle