使用系結控制碼並進行 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 執行時間會在一個介面上建立內容控制碼,該介面只能當做引數傳遞至該介面的方法。 這樣做可防止在開啟內容控制碼並在相同進程記憶體在的不同介面之間傳遞時發生的伺服器失敗。
相關主題