Teoretycznie blok try / catch nie będzie miał wpływu na zachowanie kodu, chyba że rzeczywiście wystąpi wyjątek. Istnieją jednak pewne rzadkie okoliczności, w których istnienie bloku try / catch może mieć znaczący wpływ, a niektóre rzadkie, ale prawie niezrozumiałe, w których efekt może być zauważalny. Powodem tego jest podany kod, taki jak:
Action q;
double thing1()
{ double total; for (int i=0; i<1000000; i++) total+=1.0/i; return total;}
double thing2()
{ q=null; return 1.0;}
...
x=thing1(); // statement1
x=thing2(x); // statement2
doSomething(x); // statement3
kompilator może być w stanie zoptymalizować instrukcję1 w oparciu o fakt, że instrukcja2 ma gwarancję wykonania przed instrukcją3. Jeśli kompilator rozpozna, że rzecz 1 nie ma skutków ubocznych, a rzecz 2 faktycznie nie używa x, może bezpiecznie całkowicie pominąć rzecz 1. Jeśli [jak w tym przypadku] rzecz1 była kosztowna, mogłaby to być znaczna optymalizacja, chociaż przypadki, w których rzecz1 jest droga, to także te, które kompilator najmniej by zoptymalizował. Załóżmy, że kod został zmieniony:
x=thing1(); // statement1
try
{ x=thing2(x); } // statement2
catch { q(); }
doSomething(x); // statement3
Teraz istnieje sekwencja zdarzeń, w których instrukcja3 mogłaby zostać wykonana bez wykonania instrukcji2. Nawet jeśli nic w kodzie dla thing2
nie może wyrzucić wyjątku, możliwe jest, że inny wątek użyje znaku Interlocked.CompareExchange
powiadomienia, który q
został wyczyszczony i ustawiony na Thread.ResetAbort
, a następnie wykona Thread.Abort()
instrukcję przed, do której zapisała swoją wartość x
. Następnie catch
wykonałby Thread.ResetAbort()
[przez delegata q
], umożliwiając kontynuowanie wykonywania z instrukcją3. Taka sekwencja zdarzeń byłaby oczywiście wyjątkowo nieprawdopodobna, ale do wygenerowania kodu, który działa zgodnie ze specyfikacją, wymagany jest kompilator, nawet jeśli wystąpią takie nieprawdopodobne zdarzenia.
Ogólnie rzecz biorąc, kompilator znacznie częściej dostrzega możliwości pominięcia prostych bitów kodu niż złożone, a zatem rzadkie byłoby, gdyby próba / złapanie mogło wpłynąć na wydajność znacznie, gdyby nigdy nie zgłoszono wyjątków. Mimo to istnieją sytuacje, w których istnienie bloku try / catch może uniemożliwić optymalizację, która - gdyby nie try / catch - pozwoliłaby na szybsze działanie kodu.