Le hit de performance est très probablement négligeable, comme expliqué dans cette réponse .
Partons donc avec l'idée que la performance n'est pas un problème. Vous lancez System.Exception
, juste pour déplacer l'exécution dans la catch
clause . Jeter un BadControlFlowThatShouldBeRewrittenException
serait probablement exagéré.
Décomposons cela. On a:
- Méthode
GetDataFromServer
(les noms de méthode doivent être PascalCase en C #), qui peut éventuellement lever une exception ou renvoyer un bool
.
- Si le résultat était
true
, exécutez ProcessData
.
- Revenez
null
autrement.
On dirait que la méthode où ce code est écrit, fait simplement trop de choses. GetDataFromServer
renvoyer un bool
ressemble à un défaut de conception, je m'attendrais à ce que cette méthode retourne les données qu'elle obtient du serveur , certaines IEnumerable<SomeType>
qui contiendraient 0 ou plusieurs éléments - c'est-à-dire que le chemin heureux renvoie n éléments où n> 0 , pas si heureux path retourne 0 élément, et unhappy path explose avec une exception non gérée, quelle qu'elle soit.
Cela change beaucoup l'apparence de la méthode - encore une fois, il est difficile de dire si cela a du sens, car la publication d'origine n'a qu'un seul point de sortie (et donc ne compilerait pas, car tous les chemins de code ne renvoient pas de valeur ), donc ce n'est qu'une supposition folle:
try
{
var result = GetDataFromServer();
return ProcessData(result);
}
catch
{
return null;
}
Ici, vous regarderiez ProcessData
et verriez qu'il est en train d'itérer le result
et retourne null
s'il n'y a pas d'article dans le IEnumerable
.
Maintenant, pourquoi la méthode revient-elle null
? Le serveur était en panne? Y a-t-il un bug dans la requête? La chaîne de connexion utilise des informations d'identification incorrectes? Chaque fois que vous GetDataFromServer
explosez avec une exception à laquelle vous ne vous attendez pas, vous l'avalez, la fourrez sous le tapis et retournez une null
valeur. Je recommande d'attraper des exceptions spécifiques dans ce cas et de consigner tout le reste; le débogage sera beaucoup plus facile de cette façon.
Avec une catch
clause générale qui ne capture pas l'exception, il devient assez difficile de diagnostiquer quoi que ce soit. Je ferais le moins possible à la place:
catch(Exception e)
{
return null;
}
Maintenant, vous pouvez au moins casser et inspecter e
si les choses tournent mal.
TL; DR : Non, lever et intercepter des exceptions pour le contrôle de flux n'est pas une bonne idée.