2008-12-17 5 views
1

Beaucoup de développeurs disent seulement jeter des exceptions dans des circonstances vraiment exceptionnelles. L'un d'entre eux serait si un disque dur externe que je veux écrire n'est pas allumé (donc pas un lecteur connecté/enregistré). Cependant, certaines situations sont difficiles à déterminer, qu'elles soient vraiment exceptionnelles ou non.Comment faire la distinction entre des circonstances vraiment exceptionnelles et une mauvaise condition de routine?

Par exemple, en entrant une chaîne pour un chemin de dossier mais il n'est pas trouvé. Dans ce cas, s'il y a une entrée qui ne peut pas être trouvée (comme un nom dans une collection qui n'est pas trouvée), est-il préférable de simplement retourner un message d'erreur et une action?

E.G.

public void Find(string name) 
{ 
    if(Names.contains(name) 
    { 
     string s = Names.get(name); 
    } 

    if(!Names.contains(string name) 
    { 
     throw new ???Exception; 
    } 
} 

Ou faire quelque chose comme afficher un popup et gérer la situation avec élégance?

Est-il judicieux de lancer une exception dans une instruction else ou if? Regarder une liste d'odeurs de code concernant la gestion des exceptions me ferait beaucoup de faveurs.

Répondre

1

En général, cela fonctionne comme ceci:

Si vous pouvez gérer la situation sans interruption, de le faire. (Le fichier n'existe pas, mais son entrée n'est pas essentielle à la poursuite de l'opération [préférences, configuration facultative, etc.]

Si vous avez besoin d'une intervention de l'utilisateur, demandez-lui. (Le fichier n'existe pas, mais vous en avez besoin pour continuer à fonctionner)

En cas de problème, l'utilisateur ne peut pas réparer (mémoire insuffisante, matériel défaillant, etc.), puis émettre une exception.

Chaque endroit a sa propre norme pour les détails, mais je trouve que ce qui précède fonctionne de manière générale.

1
  1. si votre code peut récupérer de l'exception, faites-le
  2. s'il serait acceptable d'exiger des clients pour vérifier une valeur de retour des exceptions prévues mineures, le font - c'est un jugement, voir ci-dessous
  3. dans tous les autres cas, jeter une exception (ou n'attrapent pas l'exception de méthode appelée)

pour le second cas, mineur et attendu sont très sensibles au contexte

IMH O n'utilisez pas d'exceptions pour le contrôle-flux, mais dans tous les autres cas vous êtes probablement plus sûr de les lancer

Notez que certains conseils d'optimisation vous demandent de vérifier les conditions au lieu de se fier aux exceptions, par ex. file-not-found, mais en réalité vous devriez toujours vous attendre à l'exception car un fichier peut être supprimé ou déplacé entre l'instruction qui vérifie l'existence et l'instruction qui tente d'ouvrir le fichier!

résumé: en général, lancer des exceptions est le cours le plus sûr. Bien sûr, avertir directement ou demander à l'utilisateur seulement être fait dans le code de l'interface utilisateur!

0

Des exceptions doivent être utilisées s'il y a quelque chose qui peut être fait à ce sujet, mais le code qui le détecte ne sait pas quoi faire.

Questions connexes