1 Ocak 2011 Cumartesi

VB.Net Gereksiz Try-Catch Blokları

Bu makalemizde hata yakalama yapısı olan try-catch bloğunun performansa etkisinden bahsedeceğiz. Bilindiği gibi .Net (Vb.Net, C#..) kodlarımızda herhangi bir satırda çıkan hatayı yönetmek için try-catch bloğu kullanırız, hata yakalama bloğu bu aşamada programın kapanmalarını engelleyebilmek için vazgeçilmezdir. Her ne kadar try-catch developer’lara yardımcı olsa da gereksiz kullanımlarda performans kayıplarına yol açabilir.  Hatalar catch bloku içerisinde yakalanır, eğer burada hiçbir işlem yapılmadan hata bir üst katmana fırlatılıyorsa bu try catch bloğu aslında gereksizdir. İkinci bir exception fırlatılması ile performans olumsuz etkilenecektir.
Örnek :
Try
   ……………………………………………
Catch ex As Exception
   Throw ex
End Try
Yukarıdaki gibi bir kodlama yapılacak ise try cath’e gerek yoktur. 
Try
………………………………………….
Catch ex As Exception
MsgBox(ex.Message)
   Throw ex             
End Try

Yukarıdaki gibi catch bloğunda bir işlem yapılacak ise kullanılması gerekmektedir. Genelde en son katmanda exceptionların yakalanması ve yönetilmesi daha doğru olacaktır. Eğer her katmanda hata yakalanır ve catch bloğunda işlem yapılmadan hata tekrar fırlatılırsa bu gereksiz performans kayıplarına yol açacaktır.


“Gereksiz Try-Catch bloklu kod”:
Private Sub WithTry()         
Try            
Throw New Exception("Hata")        
Catch ex As Exception            
Throw ex        
End Try
End Sub

“Gereksiz try-Catch bloksuz kod”:
Private Sub WithOutTry()
Throw New Exception("Hata işte")
End Sub

Yukarıdaki fonksiyonları birer butona bağlayalım ve butonun click eventlerinde bu fonksiyonları çağıralım. En son katman bu click event’leri olduğu için kodlarımız try-catch bloklu olacaktır. Aşağıdaki kod çalıştığında yaklaşık 28 milisaniye gibi bir sürede işini tamamlıyor. 
Private Sub btnWithTry_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnWithTry.Click         
Dim objNow As DateTime = Now        
Try            
WithTry()        
Catch ex As Exception            
MsgBox(Now.Subtract(objNow).TotalMilliseconds)        
End Try    
End Sub

Aşağıdaki kod çalıştığında yaklaşık 14 milisaniye gibi bir sürede işini tamamlıyor.

Private Sub btnTry_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTry.Click
        Dim objNow As DateTime = Now
        Try
            WithOutTry()
        Catch ex As Exception
            MsgBox(Now.Subtract(objNow).TotalMilliseconds)
        End Try
End Sub
 

Eğer catch bloğunda hatayı direk bir üst katmana ileteceksek try-catch bloğu kullanmamak performansı artıracaktır.

Armağan DÖKER

Hiç yorum yok:

Yorum Gönder