使用绑定句柄和进行 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