다음을 통해 공유


바인딩 핸들 사용 및 RPC 호출

RPC 프로그래머의 일반적인 실수는 모든 예외를 처리하는 것입니다. 많은 프로그래머가 다음과 같이 예외 핸들을 구성합니다.

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

이 처리기의 문제는 클라이언트 프로그램의 오류를 포함하여 모든 오류를 catch한다는 것입니다. 클라이언트 프로그램에서 오류를 catch하면 디버깅이 더 어려워집니다. 예외 처리기를 구성하는 적절한 방법은 다음과 같습니다.

    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