Compartir a través de


Uso de identificadores de enlace y realización de llamadas RPC

Un error común entre los programadores de RPC es controlar todas las excepciones. Muchos programadores estructuran sus identificadores de excepción como los siguientes:

    RpcTryExcept
        {
        RemoteSample();
        }
    RpcExcept(1)
        {
        log an error or do something else
        }
    RpcEndExcept

El problema con este controlador es que detecta todos los errores, incluidos los errores en el programa cliente. Detectar errores en el programa cliente dificulta la depuración. La manera adecuada de estructurar un controlador de excepciones es la siguiente:

    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

Este controlador de excepciones tiene la ventaja de permitir un determinado intervalo de errores. El servidor nunca devolverá estos errores porque indican un problema del lado cliente.

Además, se recomienda usar los atributos [strict_context_handle] y [type_strict_context_handle] para asegurarse de que el tiempo de ejecución de RPC crea un identificador de contexto en una interfaz que se puede pasar como argumento solo a los métodos de esa interfaz. Al hacerlo, se evitarán errores del servidor que se producen cuando se abren identificadores de contexto y se pasan entre diferentes interfaces que existen en el mismo proceso.

strict_context_handle

type_strict_context_handle