2011-01-03 13 views
6

natknął się na jakiegoś starego kodu, który jest rzucanie i pusty wzrok pewne wyjątki lane (około 20 za podróż :()C# Obsada Wyjątek

Co jeśli jest hitem wydajność brali ze względu na to? Czy mam się martwić to czy jest narzut po prostu w try/catch

Zaskakująco brakuje informacji na temat wydajności wyjątków z C#.

Dzięki, od Ciebie naprawdę.

+0

Skończyło się na znalezieniu problemu z istotą samej metody i zamieniło 30 liniowy potwór z jawnymi rzutami, aby wypróbować catchy, na dwie linie kodu, które przeszły od 3,8 sekundy z 10000 elementami do 3 milisekund. Dziękuję wszystkim! –

Odpowiedz

9

Wyjątkiem będą wolno ci więcej niż większość przeciętnych linii kodu. Zamiast rzucać, a następnie przechwytywać wyjątek, zamiast tego wykonaj sprawdzenie. Na przykład

BAD

myType foo = (myType)obj; 
foo.ExecuteOperation(); 

DOBRY

myType foo = obj as myType; 
if (foo != null) 
{ 
    foo.ExecuteOperation(); 
} 
0

Wyjątkiem są drogie, wydajność mądry. Ostatni czas mi mierzyć Zredagowano je, pobierały one około jednej milisekundy, aby rzucić i złapać każdy wyjątek.

Unikaj używania wyjątków jako mechanizmu kontroli przepływu.

+0

Nie powinien obsłużyć wyjątku, ale nie przez wyrzucenie wyjątku, mógłby sobie z tym poradzić z wdziękiem. Każdy wyjątek, którego nie może z wdziękiem złapać, jest typem wyjątku, który ma zostać rzucony, jeśli tak się stanie, nie powinno się oczywiście zdarzyć, jeśli będzie ostrożny. –

-1

Jeśli nie wystąpił problem z wydajnością i jest to jedyny sposób, w jaki należy to zrobić, należy kontynuować korzystanie z tej metody.

Być może przed próbą rzucenia można było zobaczyć niektóre z klauzul if, jeśli mógłbyś obsadzić obsadę.

+0

Wyjątki są drogie. Złą praktyką jest używanie ich do normalnej pracy. –

+0

Nigdy nie powiedziałem, że nie są drogie. Jeśli czytasz mój post, napisałem, że może go użyć tylko wtedy, gdy nie złapie problemów z wydajnością lub jest to jedyny sposób napisania algorytmu. –

+0

Wyrażenie operacyjne to "jeśli ... to jedyny sposób, w jaki musisz zrobić ten algorytm". Czasami trzeba łamać zasady. Nie jest brzydka, ale taka jest prawda. Chociaż prawdopodobnie odtworzę taki kod, aby używać TryParse, pozostaje pytanie: co zrobić, jeśli się nie powiedzie? –

0

Jak wspomnieli inni, wyjątki są drogie, gdy są rzucane. W niektórych przypadkach nie można ich uniknąć.

W tym przypadku wygląda na to, że zdecydowanie mogą.

Sugeruję użycie słowa kluczowego as przed rzutowaniem. Że powie jeśli obsada udało lub nie unikając w ten sposób zupełnie wyjątek:

object someObject; 
SomeType typedObject; 

// fill someObject 

typedObject = someObject as SomeType; 

if(typedObject == null) 
{ 
    // Cast failed 
} 
+0

Należy połączyć "if (x to T) y = (T) x;" lub "y = x jako T; if (x! = null) '. Ten pierwszy działa również ze strukturami. – Dykam

1

to złe z dwóch powodów.

  1. Wyjątki są powolne, istnieje duży trafień wydajności. Nie wydaje mi się, żeby zajęło to milisekundę, jak zauważył Matt, ale są one wystarczająco powolne, aby uniknąć ich w normalnej pracy.
  2. O ile nie masz dobrego powodu, nie powinieneś łapać pustych wyjątków. Po prostu ukrywasz problemy. Lepiej, że program się zawiesza niż to, że wykonuje potencjalnie niebezpieczne błędy.

Jeśli są to tylko grupy try { } finally { }, to wszystko jest dobre - nie ma tam żadnych kosztów ogólnych. Jednak try { } catch { } jest zarówno potencjalnie niebezpieczny, jak i potencjalnie wolny.

chodzi o dokumentację, to jest całkiem dobre: ​​http://www.codeproject.com/KB/architecture/exceptionbestpractices.aspx#Don%27tuseexceptionhandlingasmeansofreturninginformationfromamethod18

Edit: Właśnie uświadomiłem sobie mówiłeś pusty wzrok wyjątki, a nie połowu pustych wyjątki. Tak czy siak, chyba że masz do czynienia z IO, prawdopodobnie nie chcesz tego robić ze względu na wydajność.