Bu makalemde SQL Server Hata Yakalama Bloğu (TRY-CATCH) kullanımına değineceğim.
TRY CATCH Yapısı
TRY CATCH yapısı TRY ve CATCH bloğundan oluşur. Eğer TRY bloğunda bir hata oluşursa kontrol CATCH bloğuna geçer. Bir hata oluşmamışsa CATCH blogu devreye girmez. Bir hata varsa CATCH blogunda hata yakalanır. CATCH blogunun işletilmesi tamamlandıktan sonra akış bloktan sonraki kodlarla devam eder.
TRY CATCH kullanımında sadece TRY bloğunu tanımlayıp bırakamayız. Bir TRY bloğu tanımladıysak CATCH bloğunuda tanımlamak zorundayız.
Genel Yapısı:
BEGIN TRY --SQL Kodlar (Hata olabilecek kod bloğu) END TRY BEGIN CATCH --SQL Kodlar (Hata olduğunda hatanın yakalandığı kısım.) END CATCH
MS SQL'de TRY CATCH fonksiyonunun çeşitli işlevsel özellikleri vardır. Bu özellikler CATCH bloğu içinde kendi değerlerini korurlar, CATCH bloğu dışında ise geriye NULL dönerler.
ERROR_SEVERITY() Hata Dereceleri
- 0 veya 10 : Kullanıcı veri girişinden kaynaklanan hata
- 11-16 arası: Kullanıcının düzeltebileceği bir hata
- 17 : Yetersiz kaynak hatası (Diskin dolu olması veya tablonun salt okunur olması vb.)
- 18 : Yazılımdan kaynaklanan hata
- 19 : Constraint'lere takılan bir hata
- 20-25 arası: Kritik hatalar
Örnek 1:
BEGIN TRY DECLARE @Sayi int = 8/0 END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS 'Hata Numarası', ERROR_SEVERITY() AS 'Hata Derecesi', ERROR_STATE() AS 'Hata Kod Değeri', ERROR_PROCEDURE() AS 'Hata SP', ERROR_LINE() AS 'Hata Satır Numarası', ERROR_MESSAGE() AS 'Hata Mesajı' END CATCH
Örneğimizde
8 sayısı 0'a bölünmeye çalışılıyor. 0'a bölme hatası alıyoruz ve CATCH
bloğuna geçiyoruz. Fakat sorgu devam ediyor. Eğer TRY-CATCH
kullanmasaydık sorgumuz hata verdiği anda sonlanacaktı.
NOT: TRY-CATCH sadece çalışma anındaki hataları yakalayabilir. SQL kodumuzdaki syntax hatalarını yakalayamaz.
Örnek 2:
BEGIN TRY DROP TABLE TABLO5; END TRY BEGIN CATCH PRINT 'Hata Oluştu' PRINT ERROR_NUMBER(); PRINT ERROR_SEVERITY(); PRINT ERROR_STATE(); PRINT ERROR_LINE(); PRINT ERROR_MESSAGE(); END CATCH
Örneğimizde mevcut olmayan bir tabloyu drop etmek istedim ve dolayısıyla varolmadığı için bir hata oluştu. CATCH bloğuna PRINT ile "Hata Oluştu" mesajını ve TRY-CATCH fonksiyon özelliklerinide yine PRINT ile ekrana yazdırdık.