2009-07-14 6 views
0

J'ai vu code comme ceci (voir en fait une autre personne de type it up):manutention étrange exception pratique

catch (Exception ex) 
{ 
    string exception = ex.ToString(); 
} 

Est-ce mauvais code? Si oui, pourquoi? Il y a une chaîne appropriée de gestionnaires de catch (par exemple, plus spécifique, filtrer en général pour attraper toutes les exceptions, mais dans la conversion de l'exception, je suppose que vous convertissez beaucoup plus que ce qui est probablement nécessaire en une chaîne Tout ce dont vous avez vraiment besoin est le InnerMessage ou l'une des autres propriétés de la chaîne selon le scénario.)

J'ai aussi vu des devs mettre des points d'arrêt sur chaque ligne de code. cela? Pourquoi ne pas simplement mettre un en haut, puis utilisez « courir le curseur » (amour cette fonctionnalité)?

Enfin, quel est l'avantage d'utiliser pause sur toutes les exceptions dans Visual studio?

+3

Je pense que votre extrait est un très bon exemple d'odeur de code. – jon37

+0

Merci pour ce compagnon. – dotnetdev

Répondre

2

Ce développeur peut ne pas savoir que vous pouvez attraper tous (géré) exceptions comme cela ...

try 
{ 
    // do something 
} 
catch(Exception) 
{ 

} 

Et ne souffrira pas l'avertissement du compilateur d'un bloc catch comme ça ...

catch(Exception ex) 
{ 
    // don't use ex 
} 

De plus, il pourrait ne pas savoir sur le $exception pseudo-register.

+0

Eh bien mon garçon, ni moi non plus. Merci pour ça. –

+0

En fait, vous n'avez besoin que de 'catch {}'. – jasonh

2

La seule valeur du code que vous avez posté serait de permettre à l'exception complète d'être visible dans le débogueur. Ce n'est pas nécessaire, puisque le débogueur le fera de toute façon, mais peut-être que ce code était là depuis avant que le débogueur ne le fasse.

+0

J'ai vu ce code exact tel qu'il a été écrit au cours des dernières semaines lol (Visual Studio 2008 Professional Edition/.NET 2.0/3.5). – dotnetdev

3
string exception = ex.ToString(); 

Cela ne fait rien. Mieux vaut l'enregistrer ou utiliser MessageBox.Show (...) ;.

points d'arrêt sur chaque ligne ... pas beaucoup de point - run utiliser pour curseur ou enjamber/étape

Pause sur toutes les exceptions: je l'ai effectivement utilisé.. J'ai eu des exceptions qui échouent tranquillement qui ont été "traitées" par une bibliothèque en silence. Pause tout m'a aidé à dépister cela. En outre, "Break on all" peut vous aider à vous assurer que vous n'obtenez que les exceptions que vous attendez (également aidé par le fait de ne pas attraper une classe générique "Exception" mais d'attraper seulement l'exception particulière)

+0

Je ne suis pas sûr à ce sujet, mais je soupçonne que cette ligne serait même optimisée par le compilateur en mode Release. – Noldorin

+1

En outre, je pense que Visual Studio va donner un avertissement indiquant que vous avez une chaîne qui est assignée à mais jamais utilisée. – McAden

+0

Pas si il a ajouté astucieusement #pragma warning disable 0169;) – Keltex

3

Ceci ressemble à un programmeur paresseux qui:

  1. ne veut pas gérer les exceptions correctement
  2. Wants un endroit pour mettre un point d'arrêt s'il y a une exception.
+2

Alternativement, il peut y avoir une politique de pas de blocs 'catch' vides, peut-être imposée via un outil automatisé - et ce code est écrit uniquement pour contourner cela. –

+0

Non, il n'y a pas de règles ou de règles automatiques. – dotnetdev

0

Je viens d'utiliser "break on all exceptions" hier. Je cherchais un bogue assez obscur (en fait, le code fonctionnait parfaitement, ce qui est le genre de bogue le plus difficile à trouver), et pendant que mon code C# exécutait un script IronPython apparemment défectueux, je gardé ArgumentException messages apparaissant dans la console.

Il se trouve que ce code IronPython:

try: 
    value += x 
except ValueError: 
    pass 

résultats dans un ArgumentException jetés, et manipulés, à l'intérieur du moteur d'exécution IronPython.

De plus, si vous avez activé l'option "Rompre toutes les exceptions", VS interrompt réellement cette ligne value += x, appelle la source Python, vous permet d'inspecter les valeurs locales, etc. Quoi qu'il en soit, maintenant que je vois ces messages d'exception apparaître dans la console, je ne crains plus d'ignorer quelque chose qui va me mordre.