SQL VE TSQL DERS 26: HATA YÖNETİMİ

HATA YÖNETİMİ, HATA FIRLATMA, RAISERROR, TRY CATCH YAPISI

select * from sys.messages -- Sistemdeki bütün hataları listeler
select * from sys.messages where language_id=1055 -- Türkçe bütün hataları listeler

-- Yeni Hata Mesajı Eklemek
/*
Hata mesajlarının bulunduğu sys.messages sistem viewine programcılar 
tarafından da yeni hata mesajları eklenebilir.
SQL Server ilk 50.000 hata mesajını kendisi belirler ve kendisi için
ayırmıştır. Kullanıcılar 50.001 den itibaren yeni bir hata mesajı
ekleyebilir.
*/

sp_addmessage @msgnum = '50006',
		  @severity = 10,
		  @msgtext = 'Deneme Hata Mesajı - Sıfıra Bölme Hatası',
		  @with_log = 'true';

/*
msgnum: 50001'den itibaren bir sayı
severity:
1-10 --> kullanıcı kaynaklı hatalar
11-16 --> kullanıcın try catch ile yönetebileceği hatalardır.
msgtext: hata mesajı
with_log: true ise hata kodu raiserror ile çağrıldığında
sql serverın üzerinde çalıştığı işletim sisteminin event view 
ile görülebilen sistem loglarına mesajı ve oluş zamanının eklenmesini
sağlar.
*/

SELECT * FROM SYS.Messages WHERE Message_ID = 50006;

-- hata mesajımızı görüntüleyebiliriz.

sp_dropmessage 50006

-- hata mesajını silebiliriz.
/*
HATA FIRLATMAK

RAISERROR(mesaj_kod,seviye,durum)

mesaj kod: sys.messages'da yer alan hataların message_id değerini alır.
seviye: hata mesajının kritiklik seviyesini belirtir. 0-25 arası değer alır.
durum: bir hata mesajı birden fazla yerde oluştuğunda , bu yerleri birbirinden
ayırt etmek için kullanılır. 1-127 arası değer alır.

*/
declare @sayi1 int= 10
declare @sayi2 int= 0
begin try
declare @sonuc int = @sayi1/@sayi2
end try

begin catch
RAISERROR(50006,10,1)
end catch

/*
Yukarıda oluşturduğum 0'a bölme hatasını kullanmış olduk. Hata seviyesi, 10 olduğundan
normal siyah renkte verir hatayı kritik olarak görmez.
Hata seviyesini mesela 17 yapalım. O zaman kırmızı renkte daha detaylı bir hata verir.

*/
-- BİRDE SP KULLANARAK YAPALIM

CREATE PROCEDURE pr_HataBilgisiGetir
AS
SELECT
     ERROR_NUMBER() AS ErrorNumber,
     ERROR_SEVERITY() AS ErrorSeverity,
     ERROR_STATE() AS ErrorState,
     ERROR_PROCEDURE() AS ErrorProcedure,
     ERROR_LINE() AS ErrorLine,
     ERROR_MESSAGE() AS ErrorMessage;
	



DECLARE @sayi1 INT = 5
DECLARE @sayi2 INT = 0
DECLARE @sonuc INT

BEGIN TRY
	SET @sonuc = @sayi1 / @sayi2
END TRY
BEGIN CATCH
	EXECUTE pr_HataBilgisiGetir;
END CATCH;

-- hata kodu 8134 olarak geldi. Eğer hata kodunu anlamazsak
--aşağıdaki kod gibi uyarlayarak hata kodunu türkçeleştirebiliriz.

select * from sys.sysmessages where error='8134' and msglangid='1055'