幾乎所有的 COM 函式和介面方法都會傳回型別的值,HRESULT。 HRESULT(名稱可讀取為「結果句柄」)是傳回成功、警告或錯誤值的方式。 HRESULT 實際上不是句柄(請參閱 為什麼 HRESULT 不是任何動作的句柄?] :它只是一個值,其中包含數個編碼的欄位。 根據 COM 規格,零的結果表示成功,而非零的結果則表示失敗。
Important
一定要檢查 HRESULT 的回傳值。 切勿忽略 COM 函式的回傳值。 使用FAILED()SUCCEEDED()與巨集(定義於 <winerror.h>)——不要直接與 S_OK比較,因為存在其他S_OK成功碼(例如): S_FALSE
// ✅ Correct — handles all failure codes
HRESULT hr = pStream->Read(buffer, cbSize, &cbRead);
if (FAILED(hr)) {
// Handle error
return hr;
}
// ❌ Wrong — misses failure codes that aren't E_FAIL
if (hr == E_FAIL) { ... }
// ❌ Wrong — S_FALSE is success but != S_OK
if (hr != S_OK) { /* this fires for S_FALSE too */ }
現代錯誤處理輔助工具:
-
THROW_IF_FAILED(hr)— Windows 實作函式庫(wil)在失敗時拋出 C++ 例外 -
winrt::check_hresult(hr)— C++/WinRT 等價物,拋出winrt::hresult_error -
LOG_IF_FAILED(hr)— WIL 的巨集,失敗時會記錄但執行會持續
在原始程式碼層級,所有錯誤值都包含三個部分,並以底線分隔。 第一個部分是識別與錯誤相關聯之設施的前置詞,第二個部分是 E 表示錯誤,而第三個部分是描述實際條件的字串。 例如,當硬碟上沒有剩餘空間時,會傳回 STG_E_MEDIUMFULL。 STG 前置詞表示儲存設施、E 表示狀態代碼代表錯誤,而 MEDIUMFULL 會提供錯誤的特定資訊。 您可能會想要從介面方法或函式傳回的許多值都定義在 Winerror.h 中。
如需錯誤處理的詳細資訊,請參閱下列各節:
相關主題