Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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łaszawinrt::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:
- struktura kodów błędów COM
- kody w usłudze FACILITY_ITF
- używanie makr do obsługi błędów
- obsługa błędów com w językach Java i Visual Basic
- strategie obsługi błędów
- obsługa nieznanych błędów
Tematy pokrewne
-
kody błędów com COM