Der Leistungseinbruch ist höchstwahrscheinlich vernachlässigbar, wie in dieser Antwort erläutert .
Gehen wir also von der Idee aus, dass Leistung kein Problem ist. Sie werfen System.Exception
, nur um die Ausführung in die catch
Klausel zu verschieben . Einen zu werfen BadControlFlowThatShouldBeRewrittenException
wäre wahrscheinlich übertrieben.
Lassen Sie uns das zusammenfassen. Wir haben:
- Methode
GetDataFromServer
(Methodennamen sollten in C # PascalCase sein), die möglicherweise eine Ausnahme auslösen oder a zurückgeben kann bool
.
- Wenn das Ergebnis war
true
, führen Sie ProcessData
.
- Rückkehr aus
null
anderen Gründen .
Es sieht so aus, als ob die Methode, mit der dieser Code geschrieben wird, einfach zu viele Dinge tut. GetDataFromServer
Wenn Sie ein bool
Aussehen wie einen Konstruktionsfehler zurückgeben, würde ich erwarten, dass diese Methode die DatenIEnumerable<SomeType>
zurückgibt, die sie vom Server erhält . Einige enthalten 0 oder mehr Elemente. Der Happy Path gibt n Elemente zurück, bei denen n> 0 ist , nicht so glücklich Der Pfad gibt 0 Elemente zurück und der unglückliche Pfad wird mit einer nicht behandelten Ausnahme in die Luft gesprengt, was auch immer das ist.
Das ändert ziemlich viel daran, wie die Methode aussieht - auch hier ist es schwer zu sagen, ob dies sinnvoll ist, da der ursprüngliche Beitrag nur einen Exit-Punkt hat (und daher nicht kompiliert werden würde, da nicht alle Codepfade einen Wert zurückgeben ) Dies ist nur eine wilde Vermutung:
try
{
var result = GetDataFromServer();
return ProcessData(result);
}
catch
{
return null;
}
Hier würden Sie sich ansehen ProcessData
und sehen, dass es das iteriert result
, und zurückkehren, null
wenn es kein Element in der gibt IEnumerable
.
Warum kehrt die Methode zurück null
? Server war ausgefallen? Gibt es einen Fehler in der Abfrage? Die Verbindungszeichenfolge verwendet die falschen Anmeldeinformationen? Immer wenn Sie GetDataFromServer
mit einer Ausnahme in die Luft jagen, die Sie nicht erwarten, schlucken Sie sie, schieben sie unter den Teppich und geben einen null
Wert zurück. Ich würde empfehlen, in diesem Fall bestimmte Ausnahmen abzufangen und alles andere zu protokollieren. Das Debuggen wird auf diese Weise viel einfacher.
Mit einer allgemeinen catch
Klausel, die die Ausnahme nicht erfasst, wird es ziemlich schwierig, etwas zu diagnostizieren. Ich würde dies stattdessen minimal tun:
catch(Exception e)
{
return null;
}
Jetzt können Sie zumindest brechen und prüfen, e
ob etwas schief geht.
TL; DR : Nein, Ausnahmen für die Flusskontrolle zu werfen und zu fangen ist keine gute Idee.