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