Question

Comment allez-vous enseigner la gestion des exceptions aux programmeurs. Toutes les autres choses sont enseignées facilement - Structures de données, ASP.NET, WinForms, WPF, WCF - vous le nom, tout peut être enseigné facilement.

Avec le traitement des exceptions, essayez-les-catch-finally l'enseignement est tout simplement la nature syntaxique de la gestion des exceptions.

Qu'est-ce qui doit être enseigné est cependant - Quelle partie de votre code vous mettez dans le essayer bloc? Que faites-vous dans la section prises bloc?

Permettez-moi d'illustrer avec un exemple.

Vous travaillez sur un projet Windows Forms (un petit utilitaire) et que vous avez conçu comme ci-dessous avec 3 différents projets.

  1. UILayer
  2. BusinessLayer
  3. dataLayer

Si une exception (disons de chargement d'un XDocument lance une exception) est soulevée à dataLayer (les appels UILayer BusinessLayer qui à son tour appelle la couche de données), faites-vous tout ce qui suit

//In DataLayer
try {
    XDocument xd_XmlDocument = XDocument.Load("systems.xml");
} 
catch(Exception ex)
{
    throw ex;
}

qui obtient à nouveau jeté dans le BusinessLayer et qui est pris dans UILayer où je l'écris dans le fichier journal?

Est-ce que vous allez sur le traitement des exceptions?

Était-ce utile?

La solution

Pour expliquer la gestion des exceptions, expliquer le concept derrière: Le code où une erreur se produit souvent ne sait pas comment gérer correctement cette erreur Le code qui sait comment gérer correctement pourrait être. fonction qui appelle celui-ci, ou il pourrait être plus haut dans la pile d'appel.

Lorsque vous écrivez une routine qui appelle une routine qui pourrait lancer une exception, si vous savez comment gérer cette erreur correctement, mettez l'appel dans un bloc d'essai et de mettre le code de gestion des erreurs dans le bloc catch. Sinon, laissez-le seul et laisser quelque chose au-dessus de vous dans la poignée de la pile d'appel l'erreur.

Dire « ex catch, ex jeter » est pas une bonne façon de faire la gestion des exceptions, car il ne gère pas vraiment quoi que ce soit. De plus, selon la façon dont le modèle d'exception dans le fonctionnement de votre langue, qui peut être nocive si elle efface les informations de trace de pile que vous auriez pu utiliser pour déboguer la question. Il suffit de laisser la propagation d'exception la pile d'appel jusqu'à ce qu'il frappe une routine qui sait comment le gérer.

Autres conseils

Comme la plupart des choses, des exceptions et la gestion des exceptions seront probablement sembler une solution à la recherche d'un problème aux nouveaux programmeurs jusqu'à ce que vous montrer pourquoi la solution apparemment simple (codes de retour de type C et errno) fonctionne si mal. Je commencerais en motivant le problème et de le mettre dans le contexte. Montrer comment la gestion des erreurs peut être effectuée en utilisant des codes de retour ou des variables globales / statiques. Ensuite, donner des exemples de pourquoi il ne fonctionne pas bien. Alors et seulement alors, introduire des exceptions et expliquer qu'ils sont une forme de hors-bande de signalisation et que le point entier est que le comportement par défaut si vous ignorez une exception est de renvoyer la balle en la pile d'appel à quelqu'un qui peut le gérer.

Bottom line: Montrer comment la gestion des erreurs a été fait en C fera les élèves à comprendre ce que les exceptions sont vraiment et pourquoi la capture d'exceptions que vous ne pouvez pas vraiment poignée simule essentiellement façon dont les choses ont été faites dans l'âge des ténèbres

Je commencerais par Directives pour la conception des exceptions sa courte et comprend DO, DO NOT et ÉVITER. Il donne également les raisons.

Dans votre cas, la section exemple revelvent serait Exceptions d'emballage

Et s'attendre à écrire de cette façon. Notez qu'il attrape une exception spécifique et tente d'ajouter des informations afin qu'un message plus significatif se propage. A noter également que l'exception interne est maintenue pour des fins connecter

//In DataLayer

try
{
XDocument xd_XmlDocument = XDocument.Load("systems.xml");
}
catch(FileNotFoundException ex)
{
        throw new TransactionFileMissingException(
                     "Cannot Access System Information",ex);
}

UPDATE Kanini demande est-il même droit d'avoir ce bloc d'exception dans la couche de données ou si la vérification du fichier soit disponible à la couche d'affaires.

Eh bien d'abord je voudrais souligner que la raison d'être des exceptions emballage est ce

Tenez compte des exceptions spécifiques d'emballage jeté d'une couche inférieure dans une plus exception appropriée, si la partie inférieure exception de la couche n'a pas de sens dans le contexte de la couche supérieure opération.

Donc, si vous vous sentez qui ont une couche supérieure devrait savoir sur le fichier du tout, alors votre couche de données doit ressembler à ceci

//In DataLayer

XDocument xd_XmlDocument = XDocument.Load("systems.xml");

Non Essayez Catch Pas.

Personnellement, je pense que si votre couche de données peut faire quelque chose d'utile comme l'utilisation d'un systems.xml par défaut qui est une ressource d'assemblage, ne rien faire ou envelopper l'exception est un bon pari puisque votre journalisation vous indiquera quelle méthode et quel fichier a été le problème. (throw ex dans ce cas ou throw préféré ne trop, mais sans valeur ajoutée). Cela signifie qu'une fois identifié, vous serez en mesure de résoudre le problème rapidement.

En tant que asside cet exemple particulier a également le problème suivant dans ce XDocument.Load peut jeter quatre execeptions

  • ArgumentNullException
  • SecurityException
  • FileNotFoundException
  • UriFormatException

Nous ne pouvons pas garantir en toute sécurité que le code suivant ne jetterai pas et FileNotFoundException, tout simplement parce qu'il pourrait être là quand nous vérifier l'existence et partis quand nous faisons charge. Ayant cette disposition à la couche d'affaires ne serait pas utile.

 if (File.Exists("systems.xml")) 
     XDocument.Load("systems.xml");

SecurityException est encore pire parce que, entre autres raisons à cela d'être jeté si un autre accaparement des processus a un verrou de fichier exclusif, vous n'obtiendrez l'erreur jusqu'à ce que vous essayez d'ouvrir pour la lecture parce qu'il n'y a pas de méthode File.CanIOpenThis () . Et si une telle méthode existait ont encore le même problème qu'avec File.Exists

Permet de faire un jeu de rôle. (Ce n'est pas un poste de blague)

Vous devriez faire un atelier où vous agissez sur la chaîne d'appel. Chaque personne est un objet. Vous aurez besoin de quelques débutants et certaines personnes qui comprennent le « jeu » aide.

Utilisez une question vraiment simple comme fichier IO. gui-> Model-> file_io

La personne étant le lecteur de fichier doit dire la suivante jusqu'à ....

Tout d'abord le faire avec les codes de retour. (Utilisation post-it?)

si les interactions sont juste « ce que le code dit » très bientôt, vous pouvez amener les gens à se rendre compte que les exceptions sont exceptionnelles.

pour les codes de retour, passer un post-it.

pour les exceptions, jetez vos mains en l'air et dire quel est le problème.

puis les amener à faire « x catch, jeter x » et voir ho bien pire le diagnostic est ce que l'interface devient juste « le modèle avait une exception ».

Je pense que cela va fonctionner pour former les gens que vous avez parce que les gens comprennent les interactions avec d'autres personnes assez bien.

J'imagine comprendre des exceptions que vous devez d'abord comprendre la relation enfant / parent des classes par exemple. Si vous comprenez qu'un enfant peut hériter des fonctionnalités d'un parent, ils pourraient être en mesure de sur un niveau élémentaire de comprendre que si un enfant a un problème, il ne peut pas gérer ça passera ce problème (exception) jusqu'à son parent et de laisser l'accord des parents avec ça.

Cela devient une relation enchaînée jusqu'à ce que vous vous retrouvez avec un endroit où quelque chose sait comment gérer l'exception.

Et aussi loin que va finalement c'est la partie triviale ... quand un problème se produit quelque chose doit gérer pour que le programme ne sort pas fatalement, après cette exception est gérée du bloc finally est là qui exécute toujours quel que soit la prise d'essai.

Un bon exemple de cela pourrait être la mise en réseau:

  • nous faisons connexion
  • connexion est ok donc nous utilisons
  • lorsque vous avez terminé, nous fermons et ressources libres

ou en cas d'exception:

  • une connexion
  • une exception se produit quelque chose qui poignées
  • au point whichi nous libérons la connexion et les ressources associées

Donner une demande à l'internaute novice qui a une très bonne gestion des exceptions en elle. Jetez-un endroit d'exception et laissez-les déboguer avec l'aide des journaux. En suivant l'exception de leur propagation devraient être en mesure de le déboguer. Faites cet exercice 3 ou 4 fois. Maintenant, il suffit de supprimer toutes les exceptions de manipulation du code et laissez-les essayer de suivre la même exception.

Je crois que l'appréciation de l'exception de code de traitement sera immédiatement apprécié.

OMI, vous devez penser que les déclarations de contrôle de la gestion des exceptions et des flux sont fondamentalement les mêmes. Vous les utilisez pour contrôler le flux de vos programmes en fonction de quel état ils sont actuellement. La différence est la gestion des exceptions ne réagira en cas d'erreur (ou exception) se produit.

Il ne serait probablement pas aider un nouveau programmeur, mais je trouve que je compris le concept d'exceptions beaucoup mieux une fois que je commencé à utiliser monades dans la programmation fonctionnelle. A force monade vous considériez chaque « canal » par lequel les données peuvent se déplacer dans ou hors d'un programme, car tout ce qu'il fait, il fournit une abstraction commode de « cacher » couler certaines de ces données.

L'idée qu'une fonction peut avoir différents types de sortie, et une exception est comme un type de retour une plus grande priorité de la fonction est assez nette.

Rappelez-vous, je comprends ce n'est pas comment les exceptions fonctionnent dans la plupart des langues (détails de mise en œuvre), mais dans un sens abstrait, c'est ce qui se passe.

Pretend un singe utilise le clavier

Je l'habitude de dire à mes gars quand ils sont en train d'écrire le code de prétendre qu'un singe sera assis à la keyborad et utiliser cette application.

Cela leur a appris à anticiper toutes sortes de choses:

  • Les données manquantes
  • fichiers manquants
  • caractères Alpha quand vous attendez chiffres
  • Division par zéro

Je pense que ce fut l'image de mot d'avoir un singe juste touches et taper faire tout ce qu'il voulait au lieu de suivre le long bien qui a fait l'affaire. Il a travaillé pour moi.

Licencié sous: CC-BY-SA avec attribution
scroll top