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?