Son Haberler
Anasayfa / Yazılım / SQL / TRY CATCH Kullanımı

TRY CATCH Kullanımı

MS SQL’de hata yakalama olarak önceki yazılarımda @@ERROR fonksiyonundan bahsetmiştim. Tıpkı .NET ortamında CSharpta olduğu gibi MS SQL ortamında da TRY CATCH yapısı kullanabilirsiniz. Hatta @@ERROR yerine bu yapıyı kullanmanızı öneririm. Aynen .NET ortamındaki Visual Basic ve Csharp ortamındaki gibi burada da benzer şekilde bu yapıyı kullanabiliyoruz. Aynen ordaki gibi hata sonucu ilgili hata oluştuğuna dair kullanıcıları bilgilendirebiliyoruz.

Kalıpsal olarak aşağıdaki gibi bir yapıda kullanacağız.

BEGIN TRY
Hataya olabilecek kod bloğu
END TRY
BEGIN CATCH
Eğer hata olursa 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. Bu fonksiyonları aşağıdaki tabloda açıkladım.

2013121705

Şimdi bir kaç örnekle yazımıza devam edelim.

BEGIN TRY
PRINT 3/0;
END TRY
BEGIN CATCH
PRINT 'Catch bloğunun içi';
PRINT ERROR_NUMBER();
PRINT ERROR_MESSAGE();
PRINT ERROR_NUMBER();
END CATCH
PRINT 'Catch bloğunun dışı'
PRINT ERROR_NUMBER()
GO

Şimdi burada 3/0 işlemi sonucu hata oluşacağını biliyorum. Amacım hatayı yakalamak olduğu için hatayı CATCH kısmında yakalamam gerekiyor. Yani CATCH bloğunun dışında hatayı yakalasam dahi ilgili fonksiyonları kullanayamayacağım. Amacım bunu göstermek, sonucu görelim:

2013121706

Görüleceği üzere CATCH içinde hem ERROR_NUMBER hem ERROR_MESSAGE çalıştı. Hatta ERROR_NUMBER iki defa çalıştırdım. Ama CATCH dışında ERROR_NUMBER’ı yazdır dememe rağmen çalışmadı.

Bir örnek daha yapalım.

BEGIN TRY 
DROP TABLE OlmayanTablo;
END TRY
BEGIN CATCH
PRINT 'Hata oluştu'
PRINT ERROR_NUMBER();
PRINT ERROR_MESSAGE();
END CATCH;

Burada da olmayan bir tabloyu silerek bilerek hata oluşturdum. Bu sefer istediğim mesajı da ekledim. Ayrıca sistemsel olarak tablonun var olmadığına ilişkin mesaj ile birlikte hata numarasını da yazdırdım.

2013121707

@@ERROR ile TRY CATCH yapısındaki farklardan birisi de TRY CATCH yapısında istediğimiz bir mesajı birden fazla CATCH bloğu içinde yazdırabiliriz. @@ERROR ile bunu yapamayız.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir