바인딩 핸들 사용 및 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 런타임이 해당 인터페이스의 메서드에만 인수로 전달될 수 있는 컨텍스트 핸들을 하나의 인터페이스에 만들도록 하는 것이 좋습니다. 이렇게 하면 컨텍스트 핸들이 열리고 동일한 프로세스 내에 있는 다른 인터페이스 간에 전달될 때 발생하는 서버 오류를 방지할 수 있습니다.
관련 항목