Partager via


Gestion des erreurs et valeurs de retour

Les VSPackages et COM utilisent la même architecture d'erreurs. Les fonctions d' SetErrorInfo et d' GetErrorInfo font partie de l'interface de programmation d'applications Win32 (API). Tout VSPackage dans l'environnement de développement (IDE) intégré peut appeler ces API Win32 globaux pour enregistrer des informations sur l'erreur riches lors de la réception d'une notification d'erreur. Kit de développement logiciel Visual Studio fournit des assemblys d'interopérabilité pour gérer des informations sur l'erreur.

méthodes d'interopérabilité

Pour des raisons pratiques, l'IDE fournit une méthode, SetErrorInfo, à utiliser au lieu d'appeler les API Win32. Dans l' SetErrorInfod'utilisation du code managé. Lorsqu'une erreur HRESULT arrive au niveau de le message d'erreur doit être affiché (cela est souvent l'objet implémentant un gestionnaire de commandes d' IOleCommandTarget ), l'IDE utilise une autre méthode, ReportErrorInfo, pour afficher le message approprié. Dans l'utilisation du code managé la méthode d' ReportErrorInfo .

En tant qu'implémenteur d'un VSPackage, vos objets COM implémentent normalement ISupportErrorInfo. L'interface d' ISupportErrorInfo garantit que les informations sur l'erreur riches peuvent se déplacer verticalement la chaîne d'appels. Les objets peuvent être utilisés à travers des processus ou entre plusieurs threads doivent prendre en charge ISupportErrorInfo pour garantir que les informations sur l'erreur riches sont correctement marshalées vers l'appelant.

Tous les objets liés à des VSPackages et impliquées en étendant l'IDE, y compris les fabriques d'éditeur, des éditeurs, des hiérarchies, et les services offerts, doivent prendre en charge des informations sur l'erreur riches. Alors que l'IDE ne requiert pas de ces objets d'un VSPackage pour implémenter ISupportErrorInfo, il est toujours souhaitable.

L'IDE est chargé d'enregistrer des informations sur l'erreur et de les afficher à un utilisateur de Visual Studio chaque fois qu' HRESULT est propagé à l'IDE. L'IDE est également le mécanisme pour créer des objets d' ErrorInfo .

Indications générales

Vous pouvez utiliser l' SetErrorInfo et les méthodes d' ReportErrorInfo pour définir et inscrire les erreurs qui sont internes à votre implémentation d'un VSPackage également. Toutefois, en règle générale, suivez ces indications pour gérer des messages d'erreur dans votre VSPackage :

  • Implémentez ISupportErrorInfo dans vos objets COM d'un VSPackage.

  • Créez un mécanisme de signalement d'erreurs qui appelle la méthode d' SetErrorInfo dans des objets qui implémentent IOleCommandTarget.

  • Conservez les erreurs d'affichage de l'IDE aux utilisateurs via la méthode d' ReportErrorInfo .

Les informations sur l'erreur dans l'IDE

Les règles suivantes indiquent comment traiter les informations sur l'erreur dans Visual Studio l'IDE :

  • Comme stratégie défensive pour garantir que les informations sur l'erreur périmées ne sont pas stockées à des utilisateurs, des fonctions qui appelle la méthode d' ReportErrorInfo si le premier appel de la méthode d' SetErrorInfo . Passez null désactiver les messages d'erreur mis en cache avant d'appeler tout ce qui peut définir les nouvelles informations sur les erreurs.

  • Fonction qui n'inscrivent pas directement que les messages d'erreur sont uniquement autorisé à appeler la méthode d' SetErrorInfo s'ils retournent une erreur HRESULT. Il est autorisé de désactiver ErrorInfo sur l'entrée de la fonction ou en retournant à S_OK. La seule exception à cette règle est lorsqu'un appel retourne une erreur HRESULT dont la partie réceptrice peut explicitement récupérer ou ignorer sans risque.

  • Toute partie qui ignore explicitement une erreur HRESULT doit appeler la méthode d' SetErrorInfo avec S_OK. Sinon, l'objet d' ErrorInfo peut être par erreur utilisé lorsqu'une autre partie génère une erreur sans fournir leur propre ErrorInfo.

  • Toutes les méthodes qui lancent une erreur HRESULT sont encouragées à appeler la méthode d' SetErrorInfo pour fournir des informations d'erreur riches. Si HRESULT retourné est une erreur particulière de FACILITY_ITF , la méthode est requise pour fournir un objet appropriéd' ErrorInfo. Si l'erreur retournée est une erreur système (par exemple, E_OUTOFMEMORY, E_ABORT, E_INVALIDARG, E_UNEXPECTED, etc.). il est acceptable de retourner un code d'erreur sans appeler explicitement la méthode d' SetErrorInfo . Comme stratégie défensive de programmation, en lançant une erreur HRESULT (erreurs système), appelez toujours la méthode d' SetErrorInfo , avec ErrorInfo décrivant l'échec plus en détail, ou null.

  • Toutes les fonctions qui retournent une erreur lancée par un autre appel doivent transmettre des informations qui ont été reçues de l'appel manquante dans HRESULT sans modifier l'objet d' ErrorInfo .

Voir aussi

Référence

IOleCommandTarget

Autres ressources

SetErrorInfo (Component Automation)

GetErrorInfo

ISupportErrorInfo Interface