Trafienie w wydajność jest prawdopodobnie znikome, jak wyjaśniono w tej odpowiedzi .
Przejdźmy więc do wniosku, że wydajność nie stanowi problemu. Rzucasz System.Exception
, aby przenieść egzekucję do catch
klauzuli . BadControlFlowThatShouldBeRewrittenException
Jednak rzucanie byłoby prawdopodobnie przesadą.
Rozwalmy to. Mamy:
- Metoda
GetDataFromServer
(nazwy metod powinny być PascalCase w języku C #), które mogą wyrzucić wyjątek lub zwrócić a bool
.
- Jeśli wynik był
true
, uruchom ProcessData
.
- Wróć
null
inaczej.
Wygląda na to, że metoda, w której napisany jest ten kod, po prostu robi zbyt wiele rzeczy. GetDataFromServer
zwracanie bool
wygląda jak błąd projektowy, oczekiwałbym, że ta metoda zwróci dane otrzymywane z serwera , niektóre IEnumerable<SomeType>
zawierające 0 lub więcej elementów - tj. szczęśliwa ścieżka zwraca n elementów, gdzie n> 0 , niezbyt szczęśliwy ścieżka zwraca 0 elementów, a niezadowolona ścieżka wysadza się w powietrze z nieobsługiwanym wyjątkiem, cokolwiek to jest.
To bardzo zmienia wygląd metody - znowu trudno jest stwierdzić, czy ma to sens, ponieważ oryginalny post ma tylko jeden punkt wyjścia (a zatem nie skompiluje się, ponieważ nie wszystkie ścieżki kodu zwracają wartość ), więc to tylko dzikie przypuszczenie:
try
{
var result = GetDataFromServer();
return ProcessData(result);
}
catch
{
return null;
}
Tutaj możesz zobaczyć ProcessData
i zobaczyć, że iteruje iterację result
, i zwraca, null
jeśli nie ma żadnego elementu w IEnumerable
.
Dlaczego metoda się zwraca null
? Serwer nie działa? Czy w zapytaniu jest błąd? Ciąg połączenia używa niewłaściwych danych logowania? Ilekroć GetDataFromServer
wybuchnie wyjątek, którego się nie spodziewasz, połykasz go, wsuwasz pod dywan i zwracasz null
wartość. W tym przypadku zalecam wychwycenie określonych wyjątków i zapisanie wszystkiego; debugowanie będzie w ten sposób znacznie łatwiejsze.
Z ogólną catch
klauzulą, która nie wychwytuje wyjątku, dość trudno jest zdiagnozować cokolwiek. Zamiast tego zrobiłbym to minimalnie:
catch(Exception e)
{
return null;
}
Teraz możesz przynajmniej złamać i sprawdzić, e
czy coś pójdzie nie tak.
TL; DR : Nie, rzucanie i wyławianie wyjątków dla kontroli przepływu nie jest dobrym pomysłem.