Поделиться через


Использование дескрипторов привязки и вызовов 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