Penanganan Kesalahan dalam COM (COM)

Hampir semua fungsi COM dan metode antarmuka mengembalikan nilai jenis HRESULT. HRESULT (nama dapat dibaca sebagai "penanganan hasil") adalah cara mengembalikan nilai keberhasilan, peringatan, atau kesalahan. HRESULT sebenarnya bukan pegangan (lihat Mengapa HRESULT dimulai dengan H ketika tidak menangani apa pun?); itu hanya nilai dengan beberapa bidang yang dikodekan ke dalamnya. Sesuai spesifikasi COM, hasil dari nol menunjukkan keberhasilan, dan hasil nonzero menunjukkan kegagalan.

Important

Selalu periksa nilai pengembalian HRESULT. Jangan pernah mengabaikan nilai pengembalian fungsi COM. FAILED() Gunakan makro dan SUCCEEDED() (didefinisikan dalam <winerror.h>) — jangan bandingkan secara langsung dengan S_OK, karena kode keberhasilan selain S_OK yang ada (misalnya, 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 */ }

Pembantu modern untuk penanganan kesalahan:

  • THROW_IF_FAILED(hr)Windows Implementasi Pustaka (wil) melempar pengecualian C++ pada kegagalan
  • winrt::check_hresult(hr) — C++/WinRT setara, melempar winrt::hresult_error
  • LOG_IF_FAILED(hr) — makro wil yang mencatat kegagalan tetapi melanjutkan eksekusi

Pada tingkat kode sumber, semua nilai kesalahan terdiri dari tiga bagian, dipisahkan oleh garis bawah. Bagian pertama adalah awalan yang mengidentifikasi fasilitas yang terkait dengan kesalahan, bagian kedua adalah E untuk kesalahan, dan bagian ketiga adalah string yang menjelaskan kondisi aktual. Misalnya, STG_E_MEDIUMFULL dikembalikan ketika tidak ada ruang yang tersisa pada hard disk. Awalan STG menunjukkan fasilitas penyimpanan, E menunjukkan bahwa kode status mewakili kesalahan, dan MEDIUMFULL memberikan informasi spesifik tentang kesalahan tersebut. Banyak nilai yang mungkin ingin Anda kembalikan dari metode antarmuka atau fungsi didefinisikan dalam Winerror.h.

Untuk informasi selengkapnya tentang penanganan kesalahan, lihat bagian berikut ini:

Kode Kesalahan COM