Usando identificadores de associação e fazendo chamadas RPC
Um erro comum entre os programadores RPC é lidar com todas as exceções. Muitos programadores estruturam seus identificadores de exceção como o seguinte:
RpcTryExcept
{
RemoteSample();
}
RpcExcept(1)
{
log an error or do something else
}
RpcEndExcept
O problema com esse manipulador é que ele captura todos os erros, incluindo erros no programa cliente. A captura de erros no programa cliente dificulta a depuração. A maneira adequada de estruturar um manipulador de exceção é a seguinte:
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
Esse manipulador de exceção tem a vantagem de deixar um determinado intervalo de erros passar. Esses erros nunca serão retornados pelo servidor, pois indicam um problema no lado do cliente.
Além disso, é recomendável o uso dos atributos [strict_context_handle] e [type_strict_context_handle] para garantir que o tempo de execução do RPC crie um identificador de contexto em uma interface que pode ser passada como um argumento apenas para métodos dessa interface. Isso evitará falhas de servidor que ocorrem quando os identificadores de contexto são abertos e passados entre interfaces diferentes que existem dentro do mesmo processo.
Tópicos relacionados