Contents Up Previous Next

Vues d'ensemble des exceptions C++

Introduction
Stratégies pour la gestion des exceptions
Aspects techniques


Introduction

wxWidgets a été lancé bien avant que les exceptions aient été introduites en C++, il n'est donc pas surprenant qu'il ne soit pas construit autour de leur utilisation telles que le sont les bibliothèques C++ modernes. Par exemple, la bibliothèque n'envoie pas d'exceptions pour signaler les erreurs. En outre, jusqu'à la version 2.4 incluse de wxWidgets, même l'utilisation des exceptions dans le code utilisateur était dangereux car le code de la bibliothèque n'était pas exempt d'exceptions, et ainsi, une exception se progageant en son sein pouvait résulter en fuite mémoire et/ou ressource, et ce n'était également pas très pratique.

A partir de la version 2.5.1, wxWidgets est devenu plus "ami" avec les exceptions. La bibliothèque n'utilise toujours pas les exceptions elle-même, mais il est maintenant sans risque de les utiliser dans le code utilisateur, et la bibliothèque essaye de vous aider avec cela. Notez que le fait de rendre la bibliothèque sans risque vis-à-vis des exceptions est un travail encore en cours.


Stratégies pour la gestion des exceptions

Il y a plusieurs choix pour l'utilisation des exceptions dans les programmes wxWidgets. Le premier, c'est que vous pouvez ne pas les utiliser du tout. Comme indiqué ci-dessus, la bibliothèque n'envoie aucune exception par elle-même, vous n'avez donc pas à vous inquiéter à ce sujet sauf si votre propre code en envoie. C'est, bien entendu, la solution la plus simple mais pas forcément la meilleure pour faire face à toutes les erreurs possibles.

Une autre stratégie est d'utiliser les exceptions uniquement pour signaler les erreur fatales. Dans ce cas, vous n'aurez probablement pas besoin de les récupérer, et le comportement par défaut -- qui est de simplement mettre fin au programme -- est sans dout approprié. Si ce n'est pas le cas, vous pouvez surcharger OnUnhandledException() dans votre classe dérivée de wxApp pour éxécuter toute tâche de nettoyage. Notez toutefois que toute information à propos du type exact d'exception est perdue quand cette fonction est appelée, si vous en avez besoin, vous devriez surcharger OnRun() et ajouter une clause try/catch autour de l'appel à la version de la classe de base. Cela vous permettra de capturer toute exception générée pendant l'éxécution de la boucle d'événements principale. Pour faire face aux exceptions qui pourraient surgir lors du démarrage ou de l'arrêt du programme, vous devriez insérer une clause try/catch dans OnInit() et/ou OnExit() également.

Finalement, vous pouvez vouloir continuer l'éxécution même quand certaines exceptions surgissent. Si toutes vos exceptions peuvent arriver dans les gestionnaire d'événements d'une simple classe (ou seulement dans les classes dérivées de celle-ci), vous pouvez centraliser votre code de gestion des exceptions dans la méthode ProcessEvent de cette classe. Si ceci n'est pas faisable, vous devriez également voir pour surcharger wxApp::HandleEvent() ce qui vous permettrait de gérer toutes les exceptions envoyées par n'importe quel gestionnaire d'événements.


Aspects techniques

Pour supporter n'importe quel type d'exception dans la bibliothèque, vous devez la compiler avec wxUSE_EXCEPTIONS mis à 1. Cela devrait être la valeur par défaut, mais si ce n'est pas le cas, vous devez éditer le fichier include/wx/msw/setup.h sous Windows ou éxécuter configure avec l'argument --enable-exceptions sous Unix.

D'autre part, si vous ne prévoyez pas d'utiliser les exceptions, mettre cette valeur à 0 ou utiliser --disable-exceptions peut fournir une bibliothèque plus légère et plus rapide.

Comme pour n'importe quelle fonctionnalité de la bibliothèque, il y a un exemple qui montre comment l'utiliser. Merci de regarder dans les sources de cet exemple pour plus d'informations.