Secara teori, blok coba / tangkap tidak akan berpengaruh pada perilaku kode kecuali jika benar-benar terjadi pengecualian. Namun, ada beberapa keadaan yang jarang, di mana keberadaan blok coba / tangkap mungkin memiliki efek besar, dan beberapa yang tidak umum tetapi hampir tidak jelas di mana efeknya dapat terlihat. Alasannya adalah karena kode yang diberikan seperti:
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
kompiler mungkin dapat mengoptimalkan statement1 berdasarkan pada fakta bahwa statement2 dijamin untuk dieksekusi sebelum statement3. Jika kompilator dapat mengenali bahwa thing1 tidak memiliki efek samping dan thing2 tidak benar-benar menggunakan x, ia dapat dengan aman menghilangkan thing1 sama sekali. Jika [seperti dalam kasus ini] hal1 mahal, itu bisa menjadi optimasi besar, meskipun kasus di mana hal1 mahal juga mereka yang paling tidak mungkin dikompilasi oleh kompiler. Misalkan kode diubah:
x=thing1(); // statement1
try
{ x=thing2(x); } // statement2
catch { q(); }
doSomething(x); // statement3
Sekarang ada urutan peristiwa di mana statement3 bisa dieksekusi tanpa statement2 dieksekusi. Bahkan jika tidak ada dalam kode untuk thing2
bisa melempar pengecualian, akan ada kemungkinan bahwa utas lain dapat menggunakan Interlocked.CompareExchange
untuk melihat yang q
telah dihapus dan mengaturnya Thread.ResetAbort
, dan kemudian melakukan Thread.Abort()
sebelum statement2 menulis nilainya x
. Maka catch
akan mengeksekusi Thread.ResetAbort()
[via delegateq
], yang memungkinkan eksekusi untuk melanjutkan dengan statement3. Urutan peristiwa seperti itu tentu saja sangat tidak mungkin, tetapi kompiler diperlukan untuk menghasilkan kode yang bekerja sesuai dengan spesifikasi bahkan ketika peristiwa yang mustahil terjadi.
Secara umum, kompiler jauh lebih mungkin untuk melihat peluang untuk meninggalkan bit kode sederhana daripada yang kompleks, dan dengan demikian akan jarang untuk mencoba / menangkap dapat mempengaruhi kinerja banyak jika pengecualian tidak pernah dibuang. Namun, ada beberapa situasi di mana keberadaan blok coba / tangkap dapat mencegah optimasi yang - tetapi untuk coba / tangkap - akan memungkinkan kode untuk berjalan lebih cepat.