2011-01-07 12 views
12

Chciałbym wiedzieć, co jest lepsze lub/i szybsze w programowaniu ogólnym? Unikać wyjątku lub czekać na wyjątek?Co jest lepsze/szybsze? Spróbuj złapać lub uniknąć wyjątku?

uniknąć Wyjątkiem byłoby:

string a = null; 
list = someMethod(); 
if(list.Length > 0){ 
    a = list[0]; 
} 
if(a!=null) ... 

Lub spróbuj złapać wyjątek ...

string a = null; 
try{ 
    a = someMethod()[0]; 
catch{} 
if(a!=null) ... 
+1

Anuluj słowo "szybciej", nie ma to znaczenia. I to nie jest nawet właściwy sposób na użycie try-catch, skoro używasz CLR do trollingu. – BoltClock

+0

tylko przykładowy człowiek ... – carlosdubusm

+1

@BoltClock, nie, nie jest. Jeśli wystąpi wyjątek. Jest wolniej. – CaffGeek

Odpowiedz

18

Wydajność nie jest tutaj najbardziej istotna. Pytanie brzmi, który z nich prowadzi do bardziej czytelnych/możliwych do utrzymania/testowalnych programów. Możesz się później martwić o wydajność.

Zasadniczo nie należy używać wyjątków do kontroli przepływu. Są one z pewnością nielokalnymi wersjami, co utrudnia programom czytanie i śledzenie. Jako takie powinny być zarezerwowane dla wyjątkowych sytuacji. Jeśli możesz uciec, nie używając bloku try-catch do kontroli przepływu, nie rób tego. Twoje programy będą bardziej czytelne i łatwiejsze w utrzymaniu.

„prawo” sposób obsłużyć tej sytuacji jest

var list = someMethod(); 
if(list == null || list.Length == 0) { 
    // handle something bad 
} 
string a = list[0]; 
if(a != null) { 
    // go 
} 

Można uniknąć czek że list nie jest nieważna i nie jest pusta, jeśli nie jest to umowa (Contract.Ensures), który gwarantuje wartość zwracana z someMethod jest nie jest puste i nie jest puste.

Prawdą jest jednak, że wyjątki są lokalnie kosztowne. To, czy wpłyną one na wydajność twojego programu (to jest wąskie gardło), jest zupełnie inne. Ale używane właściwie, wyjątki na ogół nie są wąskim gardłem (kto dba o wydajność podczas awarii aplikacji?)

+0

Tak, dzięki za odpowiedź, wiedziałem, że coś jest nie tak z próbą i pustym połowem. Informacje o programach, które można konserwować, są bardzo prawdziwe. Może inny wyjątek nieoczekiwany może wystąpić i nigdy się nie dowiesz. Może pusty haczyk miałby sens, jeśli nie obchodzi cię, co może się zdarzyć, po prostu chcesz kontynuować działanie programu. – carlosdubusm

+1

@carlosdumusm: Wydaje się, że rozumiesz to poprawnie, ale chcę zwrócić uwagę, że puste bloki 'catch' lub bloki' catch' wychwytujące wszystkie wyjątki (np. Przechwytujące klasę podstawową 'Exception') są złe, Bad, ZŁY. Nie masz pojęcia, jaki typ wyjątku może zostać zgłoszony, ale teraz deklarujesz, że możesz obsłużyć wszystkie z nich.Kiedy sytuacja jest w złym stanie, ale nie wiesz, jak zły lub zły jest stan, ponieważ "obsługujesz" wszystkie wyjątki, potencjalnie bardzo niebezpieczne jest kontynuowanie, jakby nic się nie stało. Zajmij się tym, co wiesz, z czym możesz sobie poradzić, i szybko zawieść. – jason

+0

Tak, ma sens, mam kilka lat programowania, ale mam małą wiedzę na temat wyjątków, a czasami nie wiem, gdzie spróbować złapać lub gdzie rzucić. Dzięki. – carlosdubusm

1

zawsze zawsze zawsze unikają wyjątek, jeśli możesz.

Wyjątki powinny być wyjątkowe.

Jeśli potrafisz to przewidzieć, chroń się przed tym.

Ludzie, którzy używają pustych bloków catch jak to powinno być zakazane od korzystania z komputera ...

To także szybciej nie iść na bloki połowów.

7

Wyjątki są drogie - jeśli możesz przetestować i uniknąć wyjątku, zrób to.

Wyjątków nie należy używać do normalnego przebiegu programu.

+0

Tak, nigdy nie myślałem o kosztach wyjątków, dziękuję. – carlosdubusm

0

Wyrzucanie wyjątków jest kosztownym zadaniem, więc zawsze staram się je zatwierdzać, a nie łapać.

To powinno być łatwe do przetestowania, wygenerować kod, który zgłasza wyjątek podczas każdego uruchomienia i przetestować go na podobnym zestawie kodu, który przeprowadza sprawdzanie warunkowe i mierzy wydajność.

Jeśli kod jest udokumentowany i zawiera informacje o tym, jakie wyjątki będą odrzucane, powinieneś mieć możliwość dostosowania swojego kodu wywołującego. Oczywiście nie możesz obsłużyć każdego scenariusza (być może błędy środowiska wykonawczego niższego poziomu?), Więc twój kod powinien tylko próbować obsługiwać wyjątki, w których może rzeczywiście reagować i ewentualnie kontynuować.

2

To zależy. Niemal zawsze staram się unikać wyjątków, chyba że jest to zbyt kosztowne.

0

Wyjątki powinny być stosowane tylko w wyjątkowych warunkach (chyba że nie ma alternatywy), więc powinieneś używać funkcji "próbuj/złap" tylko wtedy, gdy dzieje się coś bardzo niezwykłego, z czym nadal musisz się uporać (pojawi się komunikat o błędzie).

Posiadanie try/catch sygnalizuje również programistom, że może wystąpić błąd zewnętrzny i należy go załatwić. W twoim przykładzie, list ma wartość null, jest po prostu normalną częścią przepływu programu/sterowania, więc nie ma w tym nic wyjątkowego.

Również, ogólnie rzecz biorąc, złapanie w złym stanie to coś złego (chociaż są sytuacje, w których jest to konieczne). To powinno i tak wymagać komentarza, aby wyjaśnić, dlaczego nie robisz nic z wyjątkami.

Jest useful blog post o irytującej wyjątkiem może się okazać przydatny

1

czysto z szeregu punktu widzenia instrukcje/wydajność ponad znacznego N wykonywania, unikając jest droższe, ponieważ jesteś sprawdzanie długości za każdym razem dla każdego wejścia . Z wyjątkiem tego, gałąź catch jest wykonywana tylko w tym przypadku.

+3

Ale to WOLNOŚĆ, kiedy to się dzieje. Maskuje inne potencjalne błędy. I to jest okropna praktyka programistyczna. – CaffGeek

+1

The Try-Catch w ogóle nie przynosi żadnego obciążenia w normalnym przepływie? Test i skok użyte w przykładzie wydają się dość tanie pod względem czasu przetwarzania. – Derrick

+0

To okropna praktyka programowania, gdy jest to puste "catch {}", które, jak powiedziałeś, maskuje inne błędy programowania. I jak już wspomniano, wyjątki powinny być stosowane w wyjątkowych warunkach, a nie czymś, co dzieje się rutynowo (np. Jeśli wiesz, że lista zawsze będzie miała wartość zerową podczas inicjalizacji i spodziewasz się, że trafi ona tak często, to nie jest już tak wyjątkowa i powinieneś zbudować w teście dla tego). – Aphex

2

oczywiście unikanie wyjątku, spróbuj złapać prowadzi do straty wydajności.

Powiązane problemy