Jeter l'Exception VS Retour d'Erreur dans un Try,Catch,finally
Je suis assez sûr que je connais déjà la réponse, mais je suis toujours curieux de ce que l'opinion est dans la manipulation d'une erreur dans un Try,Catch,finally bloc -- mais quand vous êtes à la répéter.
BTW - je ne parle pas de l'Entrée de l'Utilisateur - mais en utilisant que pour un exemple parce qu'il est clair et court
Considérer ce morceau de code...
try {
if (success) {
return someSuccessMessage;
}
else {
logError("User input not correct format");
return someErrorMessage; //repeats itself
}
}
catch (Exception ex) {
logError(ex.Message);
return someErrorMessage; //repeats itself
}
Dire que nous avons une fonction, que si elle échoue, nous voulons retourner un message d'erreur parce que l'exception n'est pas pertinent; notre fonction n'a pas réussi et que l'utilisateur n'a pas besoin de détail supplémentaire.
J'ai toujours eu la conviction que, si vous pouvez gérer l'erreur, éviter l'exception -- car il n'est pas exceptionnel, mais j'ai demandé l'avis à propos en évitant de se répéter... Vous pouvez faire ce qui suit pour éviter de vous répéter...
try {
if (success) {
return someSuccessMessage;
}
else {
throw new Exception("User input not correct format");
}
}
catch (Exception ex) {
logError(ex.Message);
return someErrorMessage;
}
Ce n'est pas le meilleur exemple, mais j'allais pour des raisons de concision pour faire le point de la répétition du code.
Exceptions sont connus pour subir une perte de performance, mais ce sont les pensées à propos de ce genre de situation?
OriginalL'auteur Hugoware | 2009-07-10
Vous devez vous connecter pour publier un commentaire.
J'question de la séparation des préoccupations. À moins que cette fonction est la partie de l'INTERFACE utilisateur, il ne doit pas se préoccuper des messages d'erreur. Il devrait être de lever des exceptions à la place. L'appelant de cette méthode, si elle fait partie de l'INTERFACE utilisateur, pourriez produire un message d'erreur à l'affichage. Si l'appelant avait un service web, il voudrait produire une erreur SOAP, qui ne peuvent pas utiliser le même message (si elle est utilisée tout message à tous).
Je voudrais aussi vous suggère fortement de vous connecter ex.ToString() et non ex.Message.
OriginalL'auteur John Saunders
De l'OMI, une Exception doit être levée uniquement quand il est à l'extérieur de corriger la situation. L'utilisateur saisie d'un format incorrect est connu et ne devraient pas jeter aucune Exception.
Traiter Exception comme c'est catastrophique (centre de données sur le feu, tremblement de terre, etc.). De cette manière, vous pourrez voir la différence entre la manipulation "régulière d'erreur" et "Exception".
Et oui, lancer et attraper Exception coût d'un lot de performance, il vaut mieux les éviter.
OriginalL'auteur Adrian Godong
Extraire les duplications de code dans une fonction, si vous vous sentez de vous répéter, est un problème.
Pour être honnête, je ne serais pas s'inquiéter à propos de la duplication d'un couple de lignes dans la même fonction.
c'est le mal. "- pas vraiment. Comme beaucoup de grands programmeurs l'ont souligné, "la Duplication est mieux que la mauvaise abstraction". Vous ne devriez pas la déduplication à la première occasion, mais seulement après qu'il est avéré être un problème.
OriginalL'auteur dave4420
Dans votre cas, je viens de renvoyer le message d'erreur (premier exemple), parce que la levée d'une exception seulement de l'attraper, 3 ligne ci-dessous semble un peu bizarre.
Est une chose complètement différente, c'est que j'ai l'habitude d'éviter le retour des codes d'erreur lorsque c'est possible - quand j'ai une situation d'erreur, j'ai par le biais d'une exception et je l'attraper au plus haut niveau possible. Dans ce sens, le code n'est pas jonché de gestion des erreurs partout, et il est beaucoup plus facile de voir la logique métier. Dans votre cas (si vous le contrôlez, bien sûr) de la méthode qui retourne le succès pourrait avoir jeté une exception en cas d'échec, et vous n'aurait pas à se poser cette question à tous 🙂
Il est vrai que les Exceptions sont coûteux en C#, donc ils ne devraient pas être victimes de violence. Ayant dit que, lorsque vous avez une erreur, le 50ms ou alors cliquez dans la performance est généralement pas pertinent, alors j'ai tendance à les utiliser pour avoir un code propre.
OriginalL'auteur Grzenio
Je serai d'accord avec votre logique dans votre exemple, mais ce que exception pensez-vous de la manipulation dans votre bloc de gestion des exceptions vs votre programmatique test? Je soupçonne votre bloc de gestion des exceptions est vraiment un "juste au cas où quelque chose s'est passé". Donc il s'agit vraiment de la gestion de l'exception à la règle.
Si vous n'avez pas besoin de gérer une exception et ses pas à travers une nette architectural limite de ne pas s'en occuper. Si elle est sur le bord d'un composant limite que vous pourriez vouloir pour l'envelopper, de placer l'original à l'intérieur de l'exception.
Si la fonctionnalité a été appelé à partir de code, vous voulez tester le résultat avec une certaine représentation de l'état comme une réponse (HRESULT est un excellent exemple de cela. 0 == SUCCÈS, != 0 == échec) ou l'utilisation d'exceptions.
Tests pour les erreurs de programmation ou de défaillances de composants, vous devez utiliser les exceptions, si vous êtes à la validation des entrées de l'utilisateur sur une INTERFACE utilisateur, vous pourriez vouloir simplement utiliser la logique et les codes d'état de retour pour aider à communiquer l'erreur à l'utilisateur.
Penser enfin au sujet de la localisation. Si vous ondulation, un anglais de message d'erreur dans le système et de le présenter à votre francophone de l'utilisateur qui ne serait pas utile et que vous ne voulez pas commencer l'analyse de chaînes à votre INTERFACE utilisateur pour générer la version française, de sorte que les exceptions sont le chemin à parcourir, tant que la charge utile de l'exception dispose de suffisamment d'informations pour générer un utile message d'erreur à l'utilisateur de prendre des mesures correctives.
Utiliser le code d'état où vous avez un couplage étroit entre les composants et le composant appelant ne sait pas quoi faire dans les différentes conditions de l'état.
BTW, Vous pourriez voulez enregistrer la trace de la pile ainsi que le message à l'aide ToString() comme il vous donnera des informations plus utiles pour résoudre le problème.
HTH
OriginalL'auteur Philip
dans ce cas, je serais vraiment dire que le try/catch est inutile, car votre cas est plus que de la manipulation de votre erreur
mais celui du bas est le style que je crois doit être utilisé pour des situations plus complexes
OriginalL'auteur