2009-12-15 9 views
1

J'ai l'instruction try-catch suivante et je ne souhaite pas lever l'exception si la propriété de message contient "Mon erreur" dans le texte.Suppression par programme des exceptions en C#

Comment puis-je programmer cela? Aussi, cela serait-il considéré comme une odeur de code?

try 
{ 
} 
catch(Exception e) 
{ 
    if(e.Messages.Contains("My error")) 
    { 
     //want to display a friendly message and suppress the exception 
    } 
    else 
    { 
     throw e; 
    } 
} 
+4

Ceci est une mauvaise odeur de code. Si pour une raison ou une autre vous devez vivre avec un framework, cela ne fera que lancer des exceptions du même type que votre code. Mais notez que c'est une différence si vous écrivez «lancer e» ou simplement «jeter» (normalement, vous voulez le dernier). –

+5

Une autre raison pour laquelle cela sent mauvais: cette technique vous empêche de localiser la chaîne d'erreur dans d'autres langues. Ou, si vous recherchez la chaîne d'erreur de quelqu'un d'autre, ils peuvent changer la chaîne dans la prochaine version, ou avoir une chaîne différente s'ils détectent que l'utilisateur est français, et ainsi de suite. –

+0

Oui, cela pourrait être pire que quand un ancien collègue a remplacé tous mes 'catch (Exception e)' par 'catch (Throwable t)' dans une application Java fortement threadée. –

Répondre

11

Vous devriez attraper l'exception spécifique que vous recherchez. Franchement, ce code est choquant. Vous devriez avoir quelque chose comme ...

public class MyCoolException : Exception { 
    public MyCoolException(string msg) : base(msg) {} 
} 

public void MyCoolMethod() { 
    // if bad things happen 
    throw new MyCoolException("You did something wrong!"); 
} 

plus tard dans votre code, vous pouvez l'utiliser comme ...

try { 
    MyCoolMethod(); 
} catch (MyCoolException e) { 
    // do some stuff 
} 
+0

+1 pour choquer. Bien que ce ne soit vraiment pas le cas, je l'ai vu trop souvent pour en être choqué :) – womp

14

Vous ne devez pas détecter d'erreurs en fonction du test d'erreur. Vous devez créer votre propre classe d'exception qui étend l'exception:

class MyErrorException : Exception { } 

et de les lancer. (Excusez ma syntaxe si c'est faux, je n'ai pas fait C# depuis un moment). Cela étant dit, jeter et attraper vos propres exceptions au lieu de les propager est parfaitement normal, et c'est comme cela que vous devriez faire la gestion des exceptions.

+1

+1 - mais c'est la notation java, en C# ce serait: class MyErrorException: System.Exception {} – kiwipom

+1

Claudiu a raison, ne regarde jamais le message de l'exceptio n pour voir si c'est juste. En passant Claudiu, la bonne syntaxe est un deux-points pour dériver une classe: 'class MyException: Exception {}'. ' –

+2

Vous (et tous les autres répondeurs jusqu'à présent) supposent qu'il contrôle le code qui lève l'exception. Est-ce vraiment le cas? – itowlson

7

Votre code crée des problèmes de maintenabilité parce qu'un simple changement de texte peut avoir des effets secondaires étranges . Vous pouvez avoir votre propre classe d'exception qui hérite de System.Exception. Ensuite, au lieu d'avoir un si vous pouvez faire ce qui suit:

try 
{ 

} 
catch(MyException myException) //or just catch(MyException) 
{ 
    //display a friendly message 
} 

aussi vous ne voulez pas faire throw e parce qu'il ne preserver la pile, juste throw; fera.

+2

+1 pour avoir appelé l'instruction 'throw e'. La manière correcte de renvoyer une exception est simplement 'throw '. – Aaronaught

+0

Puis-je avoir une raison pour la downvote? –

0

Lorsque je lance Exception plutôt qu'une classe dérivée, je veux toujours dire une assertion échouée. Je n'aime pas manquer le backend parce que nous sommes toujours en mesure de recevoir une demande (mais pas encore celle-là). Si nous portons vraiment un toast, nous ferons tout simplement erreur sur la prochaine demande. Lorsque le back-end doit générer un message d'erreur, j'ai une classe ErrorMessage qui hérite de Exception et prend ErrorMessage et ErrorMessageTitle comme arguments constructeurs.