Obsługa błędów w modelu COM (COM)

Prawie wszystkie funkcje i metody interfejsu COM zwracają wartość typu HRESULT. HRESULT (nazwa może być odczytywana jako "uchwyt wyniku") to sposób zwracania wartości powodzenia, ostrzeżenia lub błędu. HRESULT nie jest w rzeczywistości uchwytem (zobacz Dlaczego HRESULT zaczyna się od H, gdy nie jest to uchwyt do niczego?); jest to tylko wartość z kilkoma polami zakodowanymi w nim. Zgodnie ze specyfikacją MODELU COM wynik zerowy wskazuje powodzenie, a wynik niezerowy wskazuje błąd.

Ważna

Zawsze sprawdzaj wartości zwracane HRESULT. Nigdy nie ignoruj zwracanej wartości funkcji COM. FAILED() Użyj makr i SUCCEEDED() (zdefiniowanych w pliku <winerror.h>) — nie porównuje się bezpośrednio z elementem S_OK, ponieważ kody powodzenia inne niż S_OK istnieją (na przykład 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 */ }

Nowoczesne pomocniki do obsługi błędów:

  • THROW_IF_FAILED(hr)Windows biblioteki implementacji (wil) zgłasza wyjątek języka C++ w przypadku błędu
  • winrt::check_hresult(hr) — odpowiednik C++/WinRT, zgłasza winrt::hresult_error
  • LOG_IF_FAILED(hr) — makro wil, które rejestruje błąd, ale kontynuuje wykonywanie

Na poziomie kodu źródłowego wszystkie wartości błędów składają się z trzech części rozdzielonych podkreśleniami. Pierwsza część to prefiks identyfikujący obiekt skojarzony z błędem, druga część to E dla błędu, a trzecia część to ciąg opisujący rzeczywisty warunek. Na przykład STG_E_MEDIUMFULL jest zwracana, gdy na dysku twardym nie ma miejsca. Prefiks stG wskazuje magazyn, E wskazuje, że kod stanu reprezentuje błąd, a MEDIUMFULL zawiera szczegółowe informacje o błędzie. Wiele wartości, które mogą być zwracane z metody interfejsu lub funkcji, są zdefiniowane w pliku Winerror.h.

Aby uzyskać więcej informacji na temat obsługi błędów, zobacz następujące sekcje:

kody błędów com COM