
Advance Gestion des exceptions
Une exception signale généralement une erreur. Je pensais que ce n'est pas toujours indiquer une eror, il peut également signaler quelques particulièrement inhabituel, même dans votre programme qui mérite une attention particulière.
Exception & Gestion des erreurs
Aucun mater comment notre programme est bon, il doit toujours être en mesure de gérer les erreurs possibles. La plupart des applications d'aujourd'hui contiennent une certaine forme de gestion des erreurs. Malheureusement, le niveau et la qualité de la gestion des erreurs est très variable. Certaines applications offrent la gestion des erreurs tant que la demande augmente constamment des alarmes, même si l'utilisateur fournit l'entrée correcte. D'autres applications offrent erreur de manipulation que seul un développeur peut loveâ € "les messages sont remplis avec le jargon et les données sont utiles que si vous avez créé l'application. Encore d'autres applications fournissent one-size-fits-all gestion d'erreur qui indique simplement à l'utilisateur une erreur s'est produite sans dire quelle erreur il a été ou comment y remédier.
La gestion des exceptions
Une des principales caractéristiques de C + + est la gestion des exceptions, qui est une meilleure façon de penser et d'erreurs de manipulation. À l'exception de manutention des affirmations suivantes s'appliquent:
- Le code d'erreur de manipulation n'est pas aussi pénible à écrire, et il ne se mélange pas avec votre "normal" code. Vous écrivez le code que vous souhaitez passer, plus tard dans une section distincte vous écrivez le code pour faire face aux problèmes. Si vous faites plusieurs appels à une fonction, vous gérez les erreurs de cette fonction une fois, en un seul endroit.
- Les erreurs ne peuvent être ignorés. Si une fonction a besoin d'envoyer un message d'erreur à l'appelant de cette fonction, il? Jette? un objet représentant l'erreur sur la fonction. Si l'appelant doesn? T? De capture? l'erreur et de la manipuler, il va à la portée suivante enfermant dynamique, et ainsi de suite jusqu'à l'erreur est soit capturé ou le programme se termine, car il n'y avait pas de gestionnaire d'attraper ce type d'exception.
Cet article examine C? S approche de la gestion des erreurs (comme il est), explique pourquoi il n'a pas bien fonctionné pour C, et explique pourquoi il a gagné? T à tous les travaux pour C + +. Ce chapitre couvre également essayer, à deux pas, et les captures, le C + + mots-clés que la gestion des exceptions de soutien.
La gestion des erreurs en C
Dans la plupart des exemples dans ces volumes, nous utilisons assert () comme cela était prévu: pour le débogage au cours du développement avec le code qui peut être désactivée avec # define NDEBUG pour le produit port. la vérification des erreurs d'exécution utilise les fonctions require.h (assurer () et require ()) mis au point dans le chapitre 9 du volume 1. Ces fonctions sont un moyen commode de dire,? Il? Problème SA ici, vous? Ll probablement besoin pour gérer avec un code plus complexe, mais vous n? A pas besoin d'être distrait par elle dans cet exemple.? Les fonctions require.h pourrait être suffisant pour les petits programmes, mais pour les produits complexes, vous pourriez avoir besoin d'écrire du code plus sophistiqué de gestion des erreurs.
La gestion des erreurs est assez simple dans les situations où vous savez exactement quoi faire parce que vous avez toutes les informations nécessaires dans ce contexte. Bien entendu, il vous suffit de gérer l'erreur à ce point.
Le problème se produit lorsque vous mettez? T ont assez d'informations dans ce contexte, et vous avez besoin pour passer les informations d'erreur dans un contexte différent où cette information existe. En C, vous pouvez gérer cette situation en utilisant trois approches:
- informations d'erreur de retour de la fonction ou, si la valeur de retour ne peut être utilisé de cette façon, définir un indicateur d'erreur global condition. (Type C fournit errno et perror () à l'appui.) Tel que mentionné précédemment, le programmeur est susceptible d'ignorer les informations d'erreur, car fastidieuse et obscurcir la vérification d'erreur doit se produire à chaque appel de fonction. En outre, au retour d'une fonction qui frappe un état exceptionnel peut-être pas de sens.
- Utilisez le peu connu bibliothèque standard C-système de traitement de signal, mis en œuvre avec la fonction signal () (pour déterminer ce qui arrive quand l'événement se produit) et augmenter () (pour générer un événement). Encore une fois, cette approche implique un couplage élevé, car il impose à l'utilisateur d'une bibliothèque qui génère des signaux de comprendre et d'installer le signal approprié mécanisme de gestion, et aussi dans les grands projets du nombre de signaux de différentes bibliothèques pourraient entrer en conflit.
- Utilisez les fonctions goto non local dans la bibliothèque standard C: setjmp () et longjmp (). Avec setjmp () vous enregistrez un état connu bien dans le programme, et si vous avez des ennuis, longjmp () rendra cet État. Encore une fois, il ya couplage élevé entre le lieu où l'État est stockée et l'endroit où l'erreur se produit.
Lors de l'examen des régimes de gestion des erreurs en C + +, il s? Un problème supplémentaire très critique: Les techniques de signaux et C setjmp () / longjmp () n'appelle pas les destructeurs, alors Aren objets? T correctement nettoyé. (En fait, si longjmp () saute après la fin d'un champ où les destructeurs doivent être appelés, le comportement du programme n'est pas défini.) Il est donc virtuellement impossible de récupérer de manière effective à partir d'un état exceptionnel, parce que vous? Ll laisse toujours derrière les objets ce havre? t été nettoyé et qui ne peuvent plus y accéder. L'exemple suivant illustre cela avec setjmp / longjmp:
/ / Setjmp () et longjmp () # Include <iostream> # Include <csetjmp> using namespace std; Rainbow classe ( public: Rainbow () (cout <<"Rainbow ()" <<endl;) ~ Rainbow () (cout <<"~ Rainbow ()" <<endl;) ); Kansas jmp_buf; void oz () ( RB Rainbow; for (int i = 0; i <3; i + +) Cout <<"il n'y a pas lieu comme n \ home"; longjmp (Kansas, 47); ) int main () ( if (setjmp (Kansas) == 0) ( cout <<"tornade, sorcière, Munchkins ... \ n"; oz (); ) Else ( cout <<"Tante Em! <<"J'ai eu l'étrange rêve ..." <<Endl; ) ///:~)
Pages: [Page - 1] [Page - 2] [Page - 3] [Page - 4] [Page - 5] [Page - 6] [Page - 7]
Tags: Programmation en C , C + + exceptions , Programmation C + + , de capture , de classe , d'erreur , d'exception , de programmation , essayez
Ce que tu vois?
Devenir l'un des habitués en vous abonnant! Vous serez le premier à savoir quand nous ajoutons des postes plus grande comme ça. Rejoignez ni par RSS ou par courriel Mises à jour aujourd'hui!
Il n'ya pas de commentaires à ce poste. Vous pouvez suivre toutes les réponses à ce bulletin avec le fil RSS 2.0 . Vous pouvez aller directement à la fin et laisser une réponse ou TrackBack à partir de votre propre site.


































