2010-12-12 21 views
9

Il s'agit d'une question sur la meilleure pratique .net. J'ai toujours pris et des informations stockées sur les exceptions dans tous mes formulaires Web et les fenêtres des applications comme suit:Comment gérer les exceptions?

  1. Entouré chaque méthode avec prise d'essai (exception d'exception)
  2. Pour toute couche, sauf couche avant, jeté exception à la couche supérieure
  3. Dans la couche de première ligne, consigné l'exception dans un fichier journal (en général à l'aide de log4config.dll) et présenté un message convivial à l'utilisateur.

Est-ce la meilleure façon de gérer les exceptions? Ou devrais-je faire quelque chose de différent dans mes prochains projets?

+0

Que voulez-vous dire par 1.Surrounded chaque méthode avec prise d'essai (exception d'exception) – Stilgar

+0

try {// faire quelque chose} catch (exception d'exception) {// faire quelque chose} – InfoLearner

Répondre

2

Le code suivant est problématique car il écrase la trace de la pile d'origine pour e, ce qui rend les problèmes plus difficiles à diagnostiquer:

public void Foo() { 
    try { 
     Bar(); 
    } catch(Exception e) { 
     throw e; // re-throw; overwrites original stacktrace in 'e' 
    } 
} 

Le code suivant n'a pas le problème de stacktrace de Ecraser ci-dessus, mais il est encore inutilement bavard :

public void Foo() { 
    try { 
     Bar(); 
    } catch(Exception e) { 
     throw; // re-throw; preserves original stacktrace in 'e' 
    } 
} 

Les deux seraient mieux écrit comme ci-dessous. En effet, si la seule chose que vous faites dans votre bloc catch est à nouveau jeter l'exception, il n'y a pas besoin d'écrire le bloc catch du tout:

public void Foo() { 
    Bar(); 
} 
+4

Pour être exact, « jeter e "est pire car il perd la pile et en recrée un, il devrait être juste" lancer "sans aucun argument. –

+0

Prouvant ainsi combien il est facile pour un code bien intentionné d'aggraver les choses :) –

+0

@Simon - bonne prise. Merci. J'ai mis à jour ma réponse. –

6

Je n'ajouter 1 & 2 à moins d'avoir une raison particulière; par exemple pour modifier (envelopper) le message; il n'y a pas besoin puisque les exceptions augmenteront de toute façon. Et fait incorrectement, vous pouvez supprimer accidentellement la pile-trace tout-important (throw; vs throw ex; - le premier étant préféré).

-1

Voici comment PAS à gérer les exceptions.

public void method1(){ 
    try{ 
     .... 
     // all the code goes here 
     // declare any helper methods throw throwable 
     // eg: private boolean check1() throws Throwable{ ...} 
     .... 
    }catch(Throwable t){ 
     System.out.println("oops...error...good luck debugging. "); 
    } 
} 
+0

Personne ne peut suggérer un moyen plus paresseux de gérer les exceptions que :) – rana