Gestion des erreurs dans COM (COM)

Presque toutes les fonctions COM et méthodes d’interface retournent une valeur du type HRESULT. HrESULT (le nom peut être lu en tant que « handle de résultat ») est un moyen de retourner une valeur de réussite, d’avertissement ou d’erreur. Un HRESULT n’est en fait pas un handle (voir Pourquoi HRESULT commence-t-il avec H quand il n’est pas un handle à quoi que ce soit ?) ; il s’agit simplement d’une valeur avec plusieurs champs encodés dans celui-ci. Conformément à la spécification COM, le résultat de zéro indique la réussite et un résultat différent de zéro indique l’échec.

Important

Vérifiez toujours les valeurs de retour HRESULT. N’ignorez jamais la valeur de retour d’une fonction COM. Utilisez les FAILED() macros SUCCEEDED() (définies dans <winerror.h>) : ne pas comparer directement par rapport S_OKaux codes de réussite autres que S_OK ceux qui existent (par exemple) 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 */ }

Assistance moderne pour la gestion des erreurs :

  • THROW_IF_FAILED(hr)Windows Bibliothèques d’implémentation (wil) lève une exception C++ en cas d’échec
  • winrt::check_hresult(hr) — Équivalent C++/WinRT, lève winrt::hresult_error
  • LOG_IF_FAILED(hr) — macro wil qui se connecte en cas d’échec, mais continue l’exécution

Au niveau du code source, toutes les valeurs d’erreur se composent de trois parties, séparées par des traits de soulignement. La première partie est le préfixe qui identifie l’installation associée à l’erreur, la deuxième partie est E pour erreur et la troisième partie est une chaîne qui décrit la condition réelle. Par exemple, STG_E_MEDIUMFULL est retourné lorsqu’il n’y a pas d’espace laissé sur un disque dur. Le préfixe STG indique l’installation de stockage, L’E indique que le code d’état représente une erreur, et le MEDIUMFULL fournit des informations spécifiques sur l’erreur. La plupart des valeurs que vous souhaiterez peut-être retourner à partir d’une méthode d’interface ou d’une fonction sont définies dans Winerror.h.

Pour plus d’informations sur la gestion des erreurs, consultez les sections suivantes :

Codes d’erreur COM