Использование дескрипторов привязки и вызовов 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 в одном интерфейсе создавался дескриптор контекста, который можно передать в качестве аргумента только методам этого интерфейса. Это позволит предотвратить сбои сервера, возникающие при открытии дескрипторов контекста и передаче между различными интерфейсами, существующими в одном процессе.
Связанные темы