예외별 오류 표시
기존 C 프로그래머의 경우 오류는 일반적으로 반환 값 또는 오류 코드를 반환하는 특수 [out] 매개 변수를 통해 반환됩니다. 이렇게 하면 다음과 같은 방식으로 구현된 인터페이스가 발생합니다.
long sample(...)
{
...
p = new Cbar(...);
if (p == NULL)
{
// cleanup
...
return ERROR_OUTOFMEMORY;
}
}
이 방법의 문제는 RPC 반환 값이 단순히 긴 정수라는 것입니다. 오류로서 특별한 의미가 없습니다( error_status_t 서버 쪽에 특별한 의미 체계가 없음). 이는 중요한 의미를 지니고 있습니다.
첫째, RPC는 작업이 실패했음을 경고하지 않습니다. 모든 [in, out] 및 [out] 인수를 언마샬링하려고 시도합니다. 컨텍스트 핸들의 오류 의미 체계도 다릅니다. 클라이언트에 반환된 패킷은 기본적으로 성공 패킷이며, 오류 코드는 패킷 깊숙이 묻혀 있습니다. 이는 RPC가 확장 오류 정보를 사용하지 않으므로 클라이언트 소프트웨어가 호출이 실패한 위치를 식별할 수 없는 경우가 많습니다.
C++가 아닌 SEH(구조적 예외 처리) 예외를 throw하여 RPC 서버 루틴의 오류를 나타내는 것이 훨씬 더 나은 방법입니다. SEH 예외가 throw되면 컨트롤이 RPC 런타임으로 직접 이동합니다. 경우에 따라 제대로 클린 수 없는 루틴에서 오류가 발생하며 호출자에게 오류를 표시해야 합니다. 루틴은 호출자에게 오류를 반환해야 하며, 그러면 호출자에게 오류를 반환할 수 있습니다. 그러나 스택의 마지막 서버 루틴은 RPC로 반환되기 전에 예외를 throw하여 RPC에 오류가 발생했음을 나타냅니다.
관련 항목