Classe System.Runtime.InteropServices.COMException
Cet article vous offre des remarques complémentaires à la documentation de référence pour cette API.
La COMException classe est l’exception levée lorsqu’un HRESULT non reconnu est retourné à partir d’un appel de méthode COM.
Le Common Language Runtime transforme les HRESULT connus en exceptions .NET, ce qui permet aux objets COM de retourner des informations d’erreur significatives aux clients gérés. Le mappage HRESULT-à-exception fonctionne également dans l’autre sens en retournant des HRESULT spécifiques aux clients non gérés. Pour plus d’informations sur le mappage, consultez Comment mapper les HRESULT et les exceptions.
Lorsque le runtime rencontre un HRESULT inconnu (HRESULT qui n’a pas d’exception spécifique, correspondante), il lève une instance de la COMException classe. Cette exception à usage unique expose les mêmes membres que n’importe quelle exception et hérite d’une propriété publique ErrorCode qui contient le HRESULT retourné par l’appelé. Si un message d’erreur est disponible pour le runtime (obtenu à partir de l’interface IErrorInfo ou de l’objet Err
en Visual Basic, ou dans certains cas du système d’exploitation), le message est retourné à l’appelant. Si toutefois le développeur du composant COM a omis d'inclure un message d'erreur, le runtime retourne le HRESULT à huit chiffres à la place d'une chaîne de message. L’utilisation d’un HRESULT permet à l’appelant de déterminer la cause de l’exception générique.
Gérer une exception COMException
Voici quelques considérations relatives à la résolution des problèmes d’une COMException exception.
Vérifiez la ErrorCode propriété Lorsque le runtime rencontre un HRESULT inconnu et lève une COMException exception, la ErrorCode propriété inclut le message d’erreur ou, si un message d’erreur n’est pas disponible, la valeur HRESULT à huit chiffres. Le message d’erreur ou la valeur HRESULT peuvent vous aider à déterminer la cause de l’exception.
Pour obtenir la liste des valeurs HRESULT, consultez Valeurs HRESULT communes.
Lors de la transmission d’arguments à liaison tardive à des méthodes d’objets Microsoft Bureau, une COMException exception peut être levée lorsque les objets sont des objets COM. Le classeur tardif suppose que ces appels de méthode impliquent un paramètre ByRef
et que la propriété que vous passez a un accesseur set
. Si la propriété ne le fait pas, .NET génère une MissingMethodException exception (avec un CORE_E_MISSINGMETHOD
HRESULT). Pour contourner ce problème, utilisez des objets à liaison anticipée ou passez une variable au lieu d'une propriété de l'objet.
COM est utilisé pour communiquer entre Visual Studio et le processus d’hébergement. Étant donné qu’elle est utilisée avant l’exécution du code, un appel à CoInitializeSecurity entraîne la levée de cette exception. Dans certains cas, l’exécution de Visual Studio en tant que Administration istrator peut résoudre le problème. Vous pouvez également désactiver le processus d’hébergement.
Lever une exception COMException
Bien que vous puissiez utiliser la COMException classe pour retourner des HRESULT spécifiques aux clients non gérés, la levée d’une exception .NET spécifique est préférable à l’utilisation d’une exception générique. Considérez que les clients gérés et les clients non gérés peuvent utiliser votre objet .NET et lever un HRESULT sur un appelant managé est moins compréhensible que de lever une exception.