依例外狀況指出錯誤
對於傳統的 C 程式設計人員來說,錯誤通常是透過傳回值傳回,或傳回錯誤碼的特殊 [out] 參數。 這會導致介面以下列方式實作:
long sample(...)
{
...
p = new Cbar(...);
if (p == NULL)
{
// cleanup
...
return ERROR_OUTOFMEMORY;
}
}
此方法的問題在於 RPC 傳回值只是長整數。 它們沒有特殊意義做為錯誤(請注意,error_status_t 在伺服器端沒有特殊的語意),這具有重要的含意。
首先,RPC 未收到作業失敗的警示;它會嘗試取消清除所有 [in, out] 和 [out] 自變數。 內容句柄的失敗語意也不同。 傳回給用戶端的封包基本上是成功的封包,錯誤碼會埋在封包中。 這也表示 RPC 不會使用擴充錯誤資訊,因此用戶端軟體通常無法辨別呼叫失敗的位置。
藉由擲回結構化例外狀況處理 (SEH) 例外狀況(不是C++)來指出 RPC 伺服器例程中的錯誤,是較佳的方法。 擲回 SEH 例外狀況時,控件會直接移至 RPC 運行時間。 錯誤有時會在無法正確清除的例程中發生,而且需要向呼叫端指出錯誤。 例程應該將錯誤傳回給其呼叫端,進而將錯誤傳回給呼叫端等等。 不過,堆疊上的最後一個伺服器例程應該在返回 RPC 之前擲回例外狀況,以指示 RPC 發生錯誤。
相關主題