23 October 2014

SQL Hata Yakalama

SQL serverde tanımlı hata mesajlarının saklandığı tablo “sys.sysmessages” dir. Var olan sistem tablosuna yeni mesajlar eklenebilirler. Bu tabloya her veritabanından erişebiliriz. Sys.sysmessages aslında çok sayıda hata mesajını çeşitli dillerde barındıran bir sistem view’idir.

select * from sys.sysmessages

Bu sorguyu çalıştırdığımızda sistemde kayıtlı tüm mesajların kodlarını ve açıklamalarını görürüz.

select * from sys.sysmessages where error = 208

Msg 208’in açıklamasını çeşitli dillerde gösterir.

begin try
 delete Products where ProductID = 1
 end try
 begin catch
 print('Hata oluştu')
 end catch

Yukarıdaki kodu çalıştırdığımızda “Hata oluştu” mesajı çıkacaktır. Oluşan hatanın detaylarını almak istersek aşağıdaki yöntemi kullanmalıyız:

begin try
 delete Products where ProductID = 1
 end try
begin catch
 print('Hata mesajı ' + CAST(ERROR_NUMBER() as varchar(50)))
 end catch

Çıkan hata mesajının 547 olduğunu gördük. Şimdi

select * from sys.sysmessages where error = 547

kod satırını çalıştırdığımızda çıkan resultset’i inceleyelim.

message_id sütunu:

0-49999 arası Sistem hata mesajı kodları için ayrılan değer
50000 RAISERROR fonksiyonuyla anlık olarak üretilen message_id hata mesajları
50001 ve üzeri Kullanıcı tarafından tanımlanan hata mesaj kodları

severity sütunu:

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 (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ı Çok kritik hatalar (Server yöneticisi ekleyebilir)

description:
Mesajın anlamı, %s ve %d ile ek parametre kullanımı

msglangid:

Hata mesajının hangi dilde olacağını belirler

RAISERROR Fonksiyonu

Bu fonksiyon 2 amaçla kullanılır:
1-Sistemde var olan hata mesajlarından hareketle bir hata oluşumunu meydana getirmek içindir.
2-Anlık olarak türetilen bir hata mesajından harekele hata oluşumunu meydana getirmek içindir.

Kullanımı:

RAISERROR (‘mesaj’, seviyesi, durum)

Örnek:

begin try
 raiserror('Hata mesajım', 11, 0)
 end try
 begin catch
 print('Hata oluşmuştur')
 end catch

 Sisteme Hata Mesajı Kaydetmek

sp_addmessage @msgnum=50001,
 @msgtext='My Custom Exception',
 @severity=11,
 @with_log=true

Sistemden Hata Mesajını Silmek

sp_dropmessage 50001

Comments

  1. raiserror(‘Hata mesajım’, 11, 0)0 nedir ve ne işe yarar