TRY CATCH etiketine sahip kayıtlar gösteriliyor.
TRY CATCH etiketine sahip kayıtlar gösteriliyor.

SQL'de TRY CATCH Kullanımı

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.