Pour éviter toutes les réponses standard que j'aurais pu trouver sur Google, je vais fournir un exemple que vous pouvez tous attaquer à volonté.
C# et Java (et trop d'autres) ont, avec de nombreux types, un comportement de "débordement" que je n'aime pas du tout (par ex. type.MaxValue + type.SmallestValue == type.MinValue
par exemple : int.MaxValue + 1 == int.MinValue
).
Mais, vu ma nature vicieuse, je vais ajouter une insulte à cette blessure en étendant ce comportement à, disons, un Overridden DateTime
type. (Je sais que DateTime
est scellé dans .NET, mais pour les besoins de cet exemple, j'utilise un pseudo-langage qui est exactement comme C#, à l'exception du fait que DateTime n'est pas scellé).
La surcharge Add
méthode :
/// <summary>
/// Increments this date with a timespan, but loops when
/// the maximum value for datetime is exceeded.
/// </summary>
/// <param name="ts">The timespan to (try to) add</param>
/// <returns>The Date, incremented with the given timespan.
/// If DateTime.MaxValue is exceeded, the sum wil 'overflow' and
/// continue from DateTime.MinValue.
/// </returns>
public DateTime override Add(TimeSpan ts)
{
try
{
return base.Add(ts);
}
catch (ArgumentOutOfRangeException nb)
{
// calculate how much the MaxValue is exceeded
// regular program flow
TimeSpan saldo = ts - (base.MaxValue - this);
return DateTime.MinValue.Add(saldo)
}
catch(Exception anyOther)
{
// 'real' exception handling.
}
}
Bien sûr, un "if" pourrait résoudre ce problème tout aussi facilement, mais il n'en reste pas moins que je ne vois pas pourquoi on ne pourrait pas utiliser les exceptions (d'un point de vue logique, je peux comprendre que, lorsque les performances sont un problème, les exceptions doivent être évitées dans certains cas).
Je pense que dans de nombreux cas, ils sont plus clairs que les structures if et ne rompent aucun contrat de la méthode.
IMHO la réaction "Ne jamais les utiliser pour le flux de programme régulier" que tout le monde semble avoir n'est pas aussi bien construite que la force de cette réaction peut le justifier.
Ou est-ce que je me trompe ?
J'ai lu d'autres articles, traitant de toutes sortes de cas particuliers, mais ce que je veux dire, c'est qu'il n'y a rien de mal à cela si vous êtes les deux :
- Clair
- Honorer le contrat de votre méthode
Tirez sur moi.
3 votes
+1 Je ressens la même chose. Outre les performances, la seule bonne raison d'éviter les exceptions pour le flux de contrôle est lorsque le code de l'appelant sera beaucoup plus lisible avec des valeurs de retour.
4 votes
Est-ce que le : retour -1 si quelque chose est arrivé, retour -2 si autre chose, etc... est vraiment plus lisible que les exceptions ?
1 votes
Il est triste que l'on ait une réputation négative pour avoir dit la vérité : que votre exemple n'aurait pas pu être écrit avec des instructions si. (Cela ne veut pas dire qu'il est correct/complet).
0 votes
Je crois qu'il vous manque un essai d'ouverture.
0 votes
Dan, bien sûr (je sais que DateTime est scellé dans .NET comme je l'ai dit) Ingo, je ne t'ai jamais donné de réputation.
0 votes
Même que stackoverflow.com/questions/345626/
0 votes
Et stackoverflow.com/questions/174458/
0 votes
Souvent, les exceptions sont la voie du moindre étonnement. Si vous vous attendez à ce que quelque chose se produise la plupart du temps, mais qu'il y a une chance d'échec (la base de données est cassée, l'Internet est cassé, le fichier importé est de mauvais format), lancez une exception et traitez-la. L'exception peut être lancée à plusieurs niveaux et traitée là où elle doit l'être au lieu de la lancer dans une bibliothèque profonde.
0 votes
Un grand article sur le fait de ne pas faire ça : c2.com/cgi/wiki?DontUseExceptionsForFlowControl
8 votes
Je dirais que lancer une exception peut parfois être votre seule option. J'ai par exemple un composant métier qui initialise son état interne dans son constructeur en interrogeant la base de données. Il y a des moments où aucune donnée appropriée dans la base de données n'est disponible. Lancer une exception dans le constructeur est la seule façon d'annuler effectivement la construction de l'objet. Ceci est clairement indiqué dans le contrat (Javadoc dans mon cas) de la classe, donc je n'ai aucun problème à ce que le code client puisse (et doive) attraper cette exception lors de la création du composant et continuer à partir de là.
0 votes
Il y a beaucoup de situations où la seule chose raisonnable à faire est de lancez une exception. Ce n'est pas utiliser une exception pour contrôler le déroulement du programme (vous n'attrapez pas une exception). Vous lancez une exception parce qu'il n'y a rien d'autre à faire. Puisque vous ne pouvez pas faire confiance à l'appelant pour faire quelque chose de sensé, vous devriez probablement lancer en utilisant une aide qui enregistre également l'exception (instrumentation). Que va faire l'appelant avec votre exception s'il l'attrape, de toute façon ? C'est où les gens utilisent à tort les exceptions pour contrôler le déroulement du programme.
1 votes
Puisque vous avez formulé une hypothèse, il vous incombe de citer également des preuves/raisons corroborantes. Pour commencer, nommez un raison pour laquelle votre code est supérieur à un code beaucoup plus court et auto-documenté.
if
déclaration. Vous trouverez cela très difficile. En d'autres termes, vos prémisses sont erronées et les conclusions que vous en tirez sont donc fausses.1 votes
@KonradRudolph Je ne ressens aucune obligation de charge ici :) (j'aime bien ce mot cependant) Permettez-moi de reformuler : "Si une exception est claire/auto-documentée et respecte son contrat, est-il justifié de l'utiliser ?" ou, dans la forme générale, "cette hypothèse est-elle correcte ?". . Vous pouvez argumenter 2 choses 1. ce n'est pas une question utile, par ex : "une exception n'est jamais claire/auto-documentée (attention, c'est toujours une question valide). logique question) 2. c'est une hypothèse déguisée ! (et donc pas de question) Dans le premier cas, je pense qu'elle justifie une réponse (en expliquant pourquoi), dans le second cas,
1 votes
Ce n'est pas adapté à l'OS, vous êtes invités à "voter pour fermer" ("pas une vraie question" était l'option parfaite, je suis même d'accord maintenant que je connais l'OS un peu plus longtemps que le format de ces questions n'est certainement pas idéal pour l'OS). Les faits restent : je voulais connaître l'opinion des autres, pas justifier l'hypothèse. Et je suis très heureux des réponses que j'ai reçues, y compris les vôtres. Mais ceci devient trop long et hors sujet, n'hésitez pas à m'envoyer un message pour discuter de toute question relative à l'onus ou à la logique.
1 votes
Peter Bon commentaire en fait. Je l'aime bien.
0 votes
Vous devez commenter votre code pour décrire ce qu'il fait, au lieu de simplement le coder et le laisser s'expliquer. Votre code n'est pas propre du tout.
0 votes
Voir aussi la réponse ici : softwareengineering.stackexchange.com/questions/189222/