2010-05-18 4 views
5

En écrivant du code Win32 C++, j'apprécierais quelques conseils sur la façon de gérer les erreurs des API Win32.Suggestions sur la gestion des erreurs de code Win32 C++: exceptions AtlThrow vs STL

En particulier, en cas d'échec d'un appel de fonction Win32 (par exemple MapViewOfFile), est-il préférable de:

  1. utilisation AtlThrowLastWin32

  2. définir une classe Win32Exception dérivé de std :: exception, avec un membre de données HRESULT ajouté pour stocker le HRESULT correspondant à la valeur renvoyée par GetLastError?

Dans ce dernier cas, je pourrais utiliser la méthode que() pour renvoyer une chaîne d'erreur détaillée (par exemple "appel MapViewOfFile échoué dans la méthode MyClass :: DoSomething().").

Quels sont les avantages et les inconvénients de 1 vs. 2?

Y at-il une autre meilleure option qui me manque?

En note secondaire, si je veux localiser le composant que je développe, comment pourrais-je localiser l'exception what() string? Je pensais construire une table mappant la chaîne anglaise originale retournée par what() dans une chaîne d'erreur localisée Unicode. Quelqu'un pourrait-il suggérer une meilleure approche?

Merci beaucoup pour vos idées et suggestions.

Répondre

5

AtlThrow n'est pas très utile, il lève CAtlException qui ne fait qu'encapsuler un code d'erreur. Avoir un échec de MapViewOfFile est un problème vraiment exceptionnel avec un code d'erreur de bas niveau qui ne dit pas à vous ou à votre utilisateur ce qui s'est vraiment mal passé. La gestion de l'erreur est presque toujours impossible, il est peu probable que vous puissiez l'ignorer et ne pas utiliser un MMF. Vous devrez vous connecter l'erreur et terminer votre programme avec une erreur très générique.

Obtenir très détaillée dans votre message d'erreur est généralement un effort inutile. "L'appel MapViewOfFile a échoué dans la méthode MyClass :: DoSomething()" ne signifie rien du tout pour votre utilisateur ou son personnel de support. Idéal pour vous, quelque chose pour tracer l'erreur. Mais vous pouvez facilement automatiser ceci, sans problème de localisation, en utilisant les macros __FILE__ et __LINE__. Tout ce dont vous avez vraiment besoin pour faire correspondre l'erreur au code source.

Conservez le message d'erreur court et accrocheur. Pour les erreurs Windows, vous devez utiliser FormatMessage() pour laisser Windows générer le message. Il sera automatiquement localisé, le texte du message est standardisé et les mots de passe bien. Dériver de std :: exception est correct. Utilisez les ID de ressource de chaîne pour les messages personnalisés afin de pouvoir les localiser facilement. Résout le problème what() aussi.

1

Vous ne devez pas utiliser d'exceptions pour la gestion des erreurs. Les exceptions sont exceptionnelles. Pour la gestion des erreurs C++, regardez: System error support in C++0x