Visual Basic'te hata işleme için On Error (VB6) ve Try...Catch (VB.NET) yapıları kullanılır.
On Error GoTo <Label> — VB6'dan kalma eski bir yöntemdir, hata oluştuğunda belirtilen etikete geçiş yapar. İç içe yapıları desteklemez, karmaşık kodlara yol açabilir.Try...Catch...Finally — modern bir yöntemdir (VB.NET), istisnalarla çalışmayı sağlar, farklı hata türlerini farklı Catch bloklarında işlemeye olanak tanır ve Finally'de kesinlikle final işlemleri yapar.Örnekler:
VB6:
Sub OpenFile() On Error GoTo ErrorHandler Open "file.txt" For Input As #1 ' Dosyayı okuma Close #1 Exit Sub ErrorHandler: MsgBox "Hata: " & Err.Description End Sub
VB.NET:
Sub OpenFileVBNet() Try Using reader As New StreamReader("file.txt") Dim line As String = reader.ReadLine() End Using Catch ex As IOException MsgBox("Hata: " & ex.Message) Finally ' Her zaman çalışır End Try End Sub
VB6'da On Error Resume Next bloğunda bir hata meydana gelirse, nerede olduğunu nasıl öğreniriz ve nasıl düzgün bir şekilde işlem yaparız?
Doğru cevap:
On Error Resume Next modunda program bir sonraki satırda çalışmaya devam eder. Hatanın meydana gelip gelmediğini öğrenmek için, çağrının sonunda Err nesnesini kontrol etmek gerekir.
On Error Resume Next ' bazı kodlar If Err.Number <> 0 Then MsgBox "Hata: " & Err.Description Err.Clear End If
Hikaye
VB6'dan VB.NET'e geçtikten sonra, bazı işleyicileri On Error GoTo tarzında bıraktılar, bu da hataların örtülmesine neden oldu. Hata işleme mantığını karıştırdılar ve veriler veritabanında yarım kalmış haliyle kaldı, hata ancak aylar sonra fark edildi.
Hikaye
Err.Clear kullanılmadı, bu nedenle bir işlenmiş hatadan sonra Err.Number sıfır olmayan bir değer olarak kaldı. Daha sonraki kontrollerde program yanlış bir şekilde yeni bir hata meydana geldiğini düşündü ve hatalı işlem bölgelerine gitti.
Hikaye
Refaktoring sırasında On Error Resume Next'un silinmesini unuttular, bu nedenle hatalar "yutuldu" ve hiçbir mesaj verilmedi. Problem tanıma süreci saatler sürdü, çünkü uygulama normal çalışıyormuş gibi görünmesine rağmen önemli verileri kaybediyordu.