SQL Server Hata Yakalama Mekanizmasi (TRY-CATCH)
Bu makalemizde T-SQL de try catch ile hata yakalama mekanizmasinin temellerini anlamaya çalisacagiz. Programlama dillerinde oldugu gibi t-sql de de try catch bloklari olusan hatayi yakalamamizi saglar ve olusan hata hakkinda bilgi sahibi olmamiza imkan verir.
Hata yakalamak için TSQL’de asagidaki örnek syntax yapisini kullaniriz.
BEGIN TRY SELECT a = 1 SELECT b = 1/0 SELECT c = 3 END TRY BEGIN CATCH PRINT 'Hata Mesaji' END CATCH
Yukaridaki sorgu sonucu asagidaki gibi bir sonuç döner
a ----------- 1 (1 row(s) affected) b ----------- (0 row(s) affected) Hata Mesaji
TRY CATCH kullanildiginda, bir hata olustugu zaman bu hata istemciye geri döndürülmez, hata CATCH blogu içinde islenir.
.Hata Fonksiyonlari
CATCH blogu içinde kullanabilecegimiz ve olusan hata hakkinda bilgi alabilecegimiz bir çok fonksiyon var.
BEGIN TRY SELECT Sonuc = 5/0 END TRY BEGIN CATCH SELECT [Hata_Satiri] = ERROR_LINE(), [Hata_Sayisi] = ERROR_NUMBER(), [Hata_Onemi] = ERROR_SEVERITY(), [Hata_Durumu] = ERROR_STATE() SELECT [Hata_Mesaji] = ERROR_MESSAGE() END CATCH
Sonuç
----------- (0 row(s) affected) Hata_Satiri Hata_Sayisi Hata_Onemi Hata_Durumu ----------- ----------- ----------- ----------- 2 8134 16 1 (1 row(s) affected) Hata_Mesaji ----------------- Divide by zero error encountered. (1 row(s) affected)
CATCH blogunda kullanilan fonksiyonlar ve açiklamalari su sekilde;
- ERROR_NUMBER : Olusan hata numasi
- ERROR_MESSAGE : Olusan hataya ait hata mesaji.
- ERROR_LINE : Hatanin hangi satirda olustugunu gösterir.
- ERROR_SEVERITY : Hatanin önem düzeyini gösterir. CATCH blogu önem seviyesi 11 ve üzerinde olan hatalari yakalar. 11 – 16 arasinda olan hatalar kullanici veya kod hatasidir. 17-25 arasinda olan hatalar ise yazilim ve donanimdan kaynaklanan hatalardir.
- ERROR_PROCEDURE : Eger hata bir stored procedure içinde olustu ise onun adini döndürür.
Stored Procedure içinde olusan hatalari yakalamak
TRY CATCH blogu çagrilan bir stored procedure içnide olusan hatayida yakalayabilir. Bir örnek verecek olursak.
BEGIN TRY EXEC Ornek_Procedure END TRY BEGIN CATCH SELECT Hata_Satiri = ERROR_LINE(), Procedure_Adi = ERROR_PROCEDURE() SELECT [Hata_Mesaji] = ERROR_MESSAGE() END CATCH
Sonuç
Hata_Satiri Procedure_Adi ----------- ------------------- 3 NULL (1 row(s) affected) Hata_Mesaji -------------------- Could not find stored procedure 'Ornek_Procedure'. (1 row(s) affected)
Transaction ile Hata Yakalama
Hata yakalama mekanizmasi Transaction islemlerinde de oldukça faydalidir. Bu tür islemleri asagidaki gibi yapabiliriz.
BEGIN TRY BEGIN TRANSACTION INSERT INTO dbo.DimAccount (ParentAccountKey) values('deneme') COMMIT TRANSACTION END TRY BEGIN CATCH if @@TRANCOUNT>1ROLLBACK TRANSACTION select Hata_Mesaji = ERROR_MESSAGE() END CATCH
Sonuç
Hata_Mesaji ------------------------ Conversion failed when converting the varchar value 'deneme' to data type int. (1 row(s) affected) Msg 3998, Level 16, State 1, Line 1 Uncommittable transaction is detected at the end of the batch. The transaction is rolled back..
tesekkürler hocam. iyiymis.
tesekkürler.
Buyuk kucuk harf farki yok. istersen kucukde yazabilirsin.
Hocam elinize saglik, çok güzel olmus. fonksiyon kullandiginiz yerde (ERROR_MESSAGE), fonksiyonlari küçük harflerle de yazabilir miyiz acaba? Yani t-sql’de büyük küçük harf duyarliligi var mi?