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


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

Этот обработчик исключений имеет преимущество, позволяя пропускать определенный диапазон ошибок. Эти ошибки никогда не будут возвращены сервером, так как они указывают на проблему на стороне клиента.

Кроме того, рекомендуется использовать атрибуты [строгий дескриптор контекста] и [тип_строгий_дескриптор_контекста], чтобы гарантировать, что среда выполнения RPC создает дескриптор контекста, который может быть передан только методам этого интерфейса. Это позволит предотвратить сбои сервера, возникающие при открытии и передаче дескрипторов контекста между различными интерфейсами, существующими в одном процессе.

строгая_обработка_контекста

type_strict_context_handle