9
votes

Choisir entre exception et valeur de retour

J'ai créé une classe qui analyse un document du fichier.

try
{
  myParser.Parse(fileName)
}

catch(MyParsingException ex)
{
  // use ex.Error field
}


6 commentaires

question de goût? Les analgésiques que je connais dans C # utilisent l'exception.


Dupliqué possible de Valeur de retour


Y a-t-il quelque chose de plus sur cette question autre que ce qui est meilleur? Cette question est répondue à plusieurs questions par exemple. Stackoverflow.com/Questtions/99683/...


Ok ma question était déjà posée. Je vois. Votez pour le fermer, ça ne me dérange pas.


Mais merci pour les liens que je lis déjà.


Je me penche vers les deux options. Il semble que c'était une question de savoir comment vous définir un cas exceptionnel. Le sujet global dépend de votre jugement personnel . J'ai deux questions sur ce sujet sur ce sujet et je n'ai pas encore reçu de réponse satisfaisante.


7 Réponses :


15
votes

Pensez à quel point il est typique d'avoir une erreur d'analyse. Si c'est typique - favorise une valeur de retour. Des exceptions doivent être utilisées pour des choses qui ne sont pas normales.


4 commentaires

Bonne réponse. J'ai toujours une question, cependant. Ne décidant pas à quel point il dépend de votre jugement personnel? Cela me semble un peu. Par exemple, lorsque vous essayez de convertir la chaîne «ASD» en un entier, une exception sera lancée. Pouvons-nous dire que ce n'est pas typique, même si cette erreur est une assez courante?


@Anar: Dans de tels cas, vous avez généralement deux fonctions distinctes (ou une avec un drapeau) - on sera "Essayez d'analyser et de retourner un code d'erreur" et l'autre "analyser cela et lancer une exception si quelque chose" et le second On appellera généralement la première en interne et le développeur décidera ensuite de savoir lequel utiliser. Il utilisera le premier pour traiter avec l'entrée de l'utilisateur et similaire et le second pour analyser quelque chose qui provient d'une source fiable.


Dans ce contexte, ce que j'ai des difficultés à comprendre, c'est que peut-on définir " une source fiable " afin que l'analyse (non tryparse) puisse être utilisée? Ce que j'essaie de dire que cette chose fiable / non fiable est une question d'interprétation et notre interprétation pourrait naturellement être fausse. Pourquoi utiliser des exceptions ou des valeurs de retour qui dépendent de nos interprétations de maquilla-be-Faux?


@Anar: Vous devez choisir entre "Try Parse" suivi d'un chèque (que vous pouvez facilement oublier) et "juste analyser" non suivi d'un chèque (et donc rien à oublier). Si votre analyse se trouve être fausse, votre demande ne fonctionnera pas comme prévu, c'est tout.



1
votes

Si votre API dit qu'il gère une analyse d'erreurs, ce n'est pas une situation exceptionnelle et peut-être que des erreurs d'analyse doivent être retournées. Pour d'autres choses, comme des fichiers manquants, des fichiers verrouillés, une entrée non valide (autre que Dodgy analyse), vous devriez lancer des exceptions.


0 commentaires

3
votes

J'irais avec l'option trois

ParseResult result = myParser.Parse(filename)


0 commentaires

0
votes

Pour moi, cela dépend de la manière dont je prévois de consommer l'erreur et de quel type d'erreur est. Le contexte de la méthode joue également une partie. Si la méthode devrait toucher une erreur dans le XML de temps en temps de temps en temps, ce n'est pas une exception dans mes yeux et doit être traitée en conséquence.

Disons que j'écris un validateur XML, puis renvoyer une erreur est la voie à suivre. Si j'écris un analyseur de configuration XML, une exception semblerait plus appropriée.


0 commentaires

2
votes

Cela dépend si la myParsingException est juste une classe dérivée de System.Extion ou contient des informations supplémentaires sur ce qui s'est mal passé en essayant d'analyser le fichier. S'il n'y a pas de telles informations, je pense que la méthode Payse devrait peut-être renvoyer une chaîne, ou null si une erreur est survenue: xxx

ou, si l'exception est vraiment utile, contient des informations sur Le fichier (nom), numéro de ligne ... etc: xxx


0 commentaires

5
votes

La philosophie de la terre .NET sur des exceptions est un peu différente des autres plates-formes. Cela ne prend pas longtemps dans la terre .Net pour se rendre compte que vous n'êtes plus en oz et que les exceptions sont souvent jetées.

de MSDN sur .NET 4: Ne pas renvoyer les codes d'erreur. Les exceptions sont les principaux moyens de signaler des erreurs dans les cadres.

de MSDN sur .NET 4.5: Une exception est une condition d'erreur ou un comportement imprévu rencontré par un programme d'exécution.

Un exemple qu'ils donnent est si un client ne peut pas se connecter à un point final. Donc, si vous considérez que parfois des sites Web ne sont pas disponibles pour la mise en réseau ou d'autres raisons, ce qui ne correspond pas à la définition traditionnelle de «exceptionnel», vous pouvez avoir une idée de la façon dont les créateurs inventent des exceptions à utiliser.


1 commentaires

La deuxième partie de la déclaration de MSDN sur .NET 4.5 doit être ajoutée: "Les exceptions peuvent être soulevées en raison d'une erreur dans votre code ou du code que vous appelez (comme une bibliothèque partagée), ...", signifiant que < B> Les exceptions sont pour les défauts de code et non pour les défauts de données .



2
votes

Les drapeaux d'erreur ou les valeurs de retour sont généralement meilleurs dans les cas où l'appelant immédiat va traiter de la condition non valide. Les exceptions sont généralement meilleures dans les cas où il y aura de nombreux appels de fonction pouvant échouer d'une manière particulière, et la manipulation des défaillances pour tous ces appels de fonction devrait être identique.

Oftentimes L'auteur d'une méthode ne peut pas savoir lequel Scénario s'appliquera à ses appelants (en effet, il est courant que certains appelants puissent mieux s'adapter à un modèle et à l'autre). La manière préférée de la gestion de la gestion de Microsoft est d'utiliser le motif: xxx

C'est certainement un meilleur concept que confinant les appelants pour s'adapter à un modèle ou à l'autre, bien que je n'aime pas le mise en œuvre particulière. Microsoft recommande explicitement en utilisant des méthodes distinctes, plutôt que d'utiliser une méthode avec un paramètre qui indique si une défaillance devrait lancer une exception, mais que la philosophie vient à un coût: cela signifie que si l'une des étapes de gettent ou trygetthtthing peut être effectué avec une méthode "DO" ou "ESSAYER", le code de Beaucoup de geton et trygetthing devront être largement dupliqués, avec un appel "faire" méthodes et l'autre appel "essayer" méthodes "

une approche alternative serait d'avoir un objet de type délégué ou d'interface qui indique quelle méthode" Essaye "devrait faire une exception se produit. Par exemple, on pourrait avoir une fonction: xxx

éventuellement avec une surcharge qui, si les deux derniers paramètres sont omis, appelle ce qui précède avec true Pour lancezonError et une variable factice pour errinf . Si les méthodes utilisées par trygetToutent suivent un modèle similaire, il peut être capable de les appeler sans avoir à dupliquer le code pour les étuis Essayer / faire.


0 commentaires