J'écris une classe .NET wrapper pour une classe native existante qui génère des exceptions. Quelles sont les meilleures pratiques de traduction entre les exceptions C++ natives et les exceptions gérées? Attraper et relancer sur une base de un à un (par exemple std :: invalid_argument -> System.System.ArgumentException)? Y a-t-il une cartographie déjà établie quelque part?Meilleure pratique pour la traduction d'exceptions dans la classe d'encapsulation C++/CLI
Répondre
Il n'existe pas de mappage standard que je connaisse. Ce que j'ai fait dans le passé est de traduire ceux que je connais, et un bloc catch pour System.Runtime.InteropServices.SEHException. Toutes les exceptions non traduites seront transformées en cette exception. Tant que vous avez une version de débogage du code qui lance l'exception, vous devriez obtenir une belle trace de pile. Ensuite, vous pouvez aller voir l'exception et écrire le wrapper.
Mais sur le dernier projet que j'ai dû faire, je suis allé avec quelque chose de beaucoup plus simple, j'ai fini par écrire quelques dérivés System.Exception pour logic_error et runtime_error. Ensuite, j'attraperais ces 2 classes de base et j'utiliserais typeid (err) pour écrire le message .NET qui a été lancé. De cette façon, je n'ai pas "perdu" ce qui était lancé depuis le C++ mais je n'ai pas eu à tout cartographier sauf les plus importants.
La cartographie en tête-à-tête semble la meilleure approche pour moi. Le mappage "universel" est difficilement possible en raison d'exceptions spécifiques aux applications, bien qu'il existe un mappage évident pour les classes d'exceptions STL.
Il existe également un problème d'exceptions SEH du code non managé. Selon votre situation, il peut être nécessaire de les attraper et de les envelopper aussi.
Je pense que cela dépend de la conception de l'emballage. Si l'interface du gestionnaire wrapper est presque identique à l'interface de la bibliothèque non gérée, relancez les exceptions 1: 1. Si vous modifiez l'interface de manière significative, lancez les exceptions les plus appropriées pour la nouvelle interface. Dans tous les cas, assurez-vous que l'encapsuleur génère des exceptions chaque fois qu'une opération ne peut pas être terminée pour être conforme aux consignes de conception .NET.
Qu'essayez-vous vraiment de faire?
Interop traduit déjà les exceptions natives en Gérés, y compris les exceptions SEH. Cependant, une bonne conception dicte que les exceptions ALL doivent être interceptées au niveau de l'API native. Vous ne devriez pas dévier de ceci à moins qu'il y ait une bonne raison. Nous n'en savons pas assez sur votre conception.
- 1. StructureMap, LinqToSql, test de la meilleure pratique
- 2. Meilleure pratique pour Java IPC
- 3. Meilleure pratique pour la fonctionnalité de thème Wordpress
- 4. Meilleure pratique pour afficher la population de données?
- 5. Quelle est la meilleure pratique pour modifier les états d'affichage?
- 6. Meilleure pratique pour nettoyer la mémoire des applications iPhone?
- 7. Meilleure pratique pour la structure de fichiers du serveur Web
- 8. Javascript Inclure la meilleure pratique d'étiquette dans une application Rails
- 9. Meilleure pratique pour initialiser les variables membres?
- 10. Méthodes getClass() et statiques: Quelle est la meilleure pratique?
- 11. Quelle est la meilleure pratique pour la réutilisation du modèle de domaine dans les applications composites?
- 12. Quelle est la meilleure pratique pour la gestion des exceptions dans Silverlight?
- 13. Meilleure pratique pour l'idiome de référence scopé?
- 14. Meilleure pratique de JQuery pour accélérer l'animation
- 15. Meilleure pratique pour un grand service WCF?
- 16. Meilleure pratique pour les services Web
- 17. SQL Select Meilleure pratique
- 18. Meilleure pratique pour exposer des services Web
- 19. Quelle est la meilleure pratique pour inclure des fichiers actionscript externes dans l'application flexible
- 20. Meilleure pratique pour profiler une application SharePoint
- 21. Meilleure pratique pour le placement de la logique d'affichage dans une vue dans CakePHP
- 22. Meilleure pratique pour gérer les classes de site
- 23. Quelle est la meilleure pratique pour lutter contre le problème de fermeture de la console?
- 24. Meilleure pratique pour DLL appelant un objet dans l'EXE
- 25. Meilleure pratique pour justifier un numéro numérique dans TSQL
- 26. Microsoft AJAX retour partiel, utilise la meilleure pratique webservice?
- 27. Meilleure pratique: Scripts intersites légitimes
- 28. Quelle est la meilleure pratique pour gérer toutes les exceptions dans l'application WPF?
- 29. Quelle est la meilleure pratique pour créer des modèles de contrôle RE-USABLE dans Silverlight
- 30. Quelle est la meilleure pratique pour définir des extensions dans un standard XML?