EDIT: Je suis d'accord avec d'autres qui disent que, depuis C # 6.0, les filtres d'exception sont désormais une solution parfaitement adaptée:catch (Exception ex) when (ex is ... || ex is ... )
Sauf que je déteste toujours la mise en page sur une seule ligne et que je présenterais personnellement le code comme suit. Je pense que c'est aussi fonctionnel qu'esthétique, car je pense que cela améliore la compréhension. Certains peuvent être en désaccord:
catch (Exception ex) when (
ex is ...
|| ex is ...
|| ex is ...
)
ORIGINAL:
Je sais que je suis un peu en retard à la fête ici, mais sainte fumée ...
Aller droit au but, ce type de duplique une réponse antérieure, mais si vous voulez vraiment effectuer une action commune pour plusieurs types d'exceptions et garder le tout propre et bien rangé dans le cadre de la seule méthode, pourquoi ne pas simplement utiliser un lambda / fermeture / fonction en ligne pour faire quelque chose comme ce qui suit? Je veux dire, les chances sont assez bonnes que vous finissiez par réaliser que vous voulez simplement faire de cette fermeture une méthode distincte que vous pouvez utiliser partout. Mais alors il sera super facile de le faire sans réellement changer le reste du code structurellement. Droite?
private void TestMethod ()
{
Action<Exception> errorHandler = ( ex ) => {
// write to a log, whatever...
};
try
{
// try some stuff
}
catch ( FormatException ex ) { errorHandler ( ex ); }
catch ( OverflowException ex ) { errorHandler ( ex ); }
catch ( ArgumentNullException ex ) { errorHandler ( ex ); }
}
Je ne peux pas m'empêcher de me demander ( avertissement: un peu d'ironie / sarcasme à venir) pourquoi diable faire tous ces efforts pour remplacer simplement ce qui suit:
try
{
// try some stuff
}
catch( FormatException ex ){}
catch( OverflowException ex ){}
catch( ArgumentNullException ex ){}
... avec une variation folle de cette odeur de code suivante, je veux dire par exemple, seulement pour prétendre que vous enregistrez quelques touches.
// sorta sucks, let's be honest...
try
{
// try some stuff
}
catch( Exception ex )
{
if (ex is FormatException ||
ex is OverflowException ||
ex is ArgumentNullException)
{
// write to a log, whatever...
return;
}
throw;
}
Parce qu'il n'est certainement pas automatiquement plus lisible.
Certes, j'ai laissé les trois instances identiques /* write to a log, whatever... */ return;
du premier exemple.
Mais c'est en quelque sorte mon point. Vous avez tous entendu parler des fonctions / méthodes, non? Sérieusement. Écrivez une ErrorHandler
fonction commune et, comme, appelez-la depuis chaque bloc catch.
Si vous me demandez, le deuxième exemple (avec les mots if
- is
clés et ) est à la fois beaucoup moins lisible et simultanément beaucoup plus sujet aux erreurs pendant la phase de maintenance de votre projet.
La phase de maintenance, pour toute personne qui pourrait être relativement nouvelle dans la programmation, représentera 98,7% ou plus de la durée de vie globale de votre projet, et le pauvre schmuck qui effectue la maintenance va presque certainement être quelqu'un d'autre que vous. Et il y a de fortes chances qu'ils passent 50% de leur temps au travail à maudire votre nom.
Et bien sûr, FxCop vous aboie et vous devez donc également ajouter un attribut à votre code qui a précisément un lien avec le programme en cours d'exécution, et n'est là que pour dire à FxCop d'ignorer un problème qui, dans 99,9% des cas, est totalement correct en signalant. Et, désolé, je peux me tromper, mais cet attribut "ignorer" ne se compile-t-il pas réellement dans votre application?
Est-ce que mettre l'ensemble du if
test sur une seule ligne le rendrait plus lisible? Je ne pense pas. Je veux dire, il y a longtemps, un autre programmeur a soutenu avec véhémence que mettre plus de code sur une ligne le rendrait "plus rapide". Mais bien sûr, il était complètement fou. Essayer de lui expliquer (avec un visage impassible - ce qui était difficile) comment l'interprète ou le compilateur briserait cette longue ligne en déclarations discrètes d'une instruction par ligne - essentiellement identiques au résultat s'il était allé de l'avant et vient de rendre le code lisible au lieu d'essayer de surpasser le compilateur - n'a eu aucun effet sur lui. Mais je m'égare.
À quel point cela est-il moins lisible lorsque vous ajoutez trois autres types d'exception, dans un mois ou deux? (Réponse: ça devient beaucoup moins lisible).
L'un des points majeurs, en réalité, est que la plupart du point de formatage du code source textuel que nous regardons tous tous les jours est de rendre vraiment, vraiment évident pour les autres êtres humains ce qui se passe réellement lorsque le code s'exécute. Parce que le compilateur transforme le code source en quelque chose de totalement différent et ne se soucie pas du style de formatage de votre code. Donc, tout-en-une-ligne est tout aussi nul.
Je dis juste ...
// super sucks...
catch( Exception ex )
{
if ( ex is FormatException || ex is OverflowException || ex is ArgumentNullException )
{
// write to a log, whatever...
return;
}
throw;
}