Makale Özeti

Veritabanı bazlı uygulamalar ile çalışırken, oluşturulan sorguların hata vermesi oldukça muhtemel bir durumdur. Sql Server 2000, hata yakalamak için özel bir T-Sql komutuna sahip değildir. Muhtemel hatalar @@Error ile yakalanmaya çalışılır ama Sql Server 2005 Try - Catch hata yakalama mekanizması ile gelmektedir.

Makale

Veritabanı bazlı uygulamalar ile çalışırken, oluşturulan sorguların hata vermesi oldukça muhtemel bir durumdur. Sql Server 2000, hata yakalamak için özel bir T-Sql komutuna sahip değildir. Muhtemel hatalar @@Error ile yakalanmaya çalışılır, eğer bir hata oluşmuşsa, @@Error’un döndüreceği hata koduna göre işlem yapılır. Basit bir örnek yapacak olursak :

create procedure AddNewProduct

(

      @ProductName nvarchar(50),

      @Quantity  int,

      @Price float,

      @Code nvarchar(20)

)

as

begin transaction

  insert into Products (ProductName,Quantity,Price,Code)

      values (@ProductName,@Quantity,@Price,@Code)

  if @@Error <> 0

  begin

      rollback

        goto LogError;

  end

commit transaction

return 0;

LogError:

Select 'Hata Olustu'

return -1

Yukarıdaki örnekte Insert işlemi sonucu oluşabiliecek bir hata @@Error ile alınıp LogError label’ına iletilip, işlem rollback yapılıyor ve oradan da hata ekrana fırlatılıyor ki istenirse hatalar  tablo’ya da kayıt olarak girilebilir .

Ufak bir transaction için burada @@Error ile yakalanacak hata pek maliyetli değildir fakat biraz daha büyük bir transaction’da muhtemel oluşabiliecek her hata için bir @@Error yakalama mekanizması yazmak masraflı olacaktır. Örneğin :

Begin transaction

insert…

  if @@Error <> 0

  begin

      rollback tran

        goto LogError;

  end

delete…

  if @@Error <> 0

  begin

      rollback tran

        goto LogError;

  end

update…

  if @@Error <> 0

  begin

      rollback tran

        goto LogError;

  end

commit transaction

Böyle bir mekanizmada bazı işlemleri yapabilmek için kısıtlı kalıyorduk.Bu noktaları belirleyecek olursak;

  •  Hata ile ilgili gelişmiş bir bilgi yok

  • Hata yönetimi için merkezileştirilmiş bir kontrol yok

  • Muhtemel hata noktaları sürekli @@Error ile kontrol edilmek zorunda

Sql Server 2005 ise yukarıdaki sorunları gidermek için ,programcılıktan yakından tanıdığımız Try Catch hata yakalama mekanizması ile karşımıza çıkıyor. T-Sql için kullanılacak olan Try Catch bloğunun syntax’ı aşağıdaki gibidir :

TRY

{ Sql Sorgusu || Kod Bloğu }

END TRY

BEGIN CATCH

{ Sql Sorgusu || Kod Bloğu }

END CATCH

Yanı programlama mantığı ile muhtemel hata verecek olan işlem try içersinde kullanılıp, hata verirse Catch kısmından yakalanacaktır. Örneğin :

BEGIN TRY

    select 1/0

END TRY

BEGIN CATCH

    SELECT ERROR_NUMBER() AS Hata

END CATCH;

1’i 0’a bölüm yapamayacağı için bu sorgu hata verecektir. Verilecek hatayı @@Error ile değil TRY kod bloğu içerinde yakalayıp oluşan hata konudu ERROR_NUMBER() ile hatanın kodunu alıyoruz.  Ek olarak hata ile ilgili ;

·         ERROR_NUMBER() : Oluşan hatanın kodunu verir

·         ERROR_MESSAGE()  : Oluşan hatanın tam metnini verir. Bu hata mesajı hatanın parametreleri, açıklaması, zamanlaması gibi bilgileri içerir.

·         ERROR_SEVERITY() : Hatanın önem derecesini bildirir

·         ERROR_STATE() : Hatanın durum numarasını döndürür.

·         ERROR_LINE() : Hatanın oluştuğu satırı bildirir.

·         ERROR_PROCEDURE() : Hatanın oluştuğu stored procedure’un veya trigger’ın adını döndürür .

BEGIN TRY

    select 1/0

END TRY

BEGIN CATCH

    SELECT ERROR_NUMBER() AS HATANUMARASI ,ERROR_MESSAGE() AS HATAMESAJ, ERROR_SEVERITY() AS ONEM, ERROR_STATE() AS DURUM

END CATCH;

 Artık bu çıktıyı istediğiniz gibi kullanabilirsiniz.  Örneğin hatalar diye bir xml dosyasına veya hatalar adındaki tabloya hata kayıtları tutulabilir.

BEGIN TRY

    select 1/0

END TRY

BEGIN CATCH

    Insert Into Errors SELECT ERROR_NUMBER() ,ERROR_MESSAGE() , ERROR_STATE(), ERROR_SEVERITY()

END CATCH;

Bir başka makalede görüşmek üzere

Okan Tekeli

okan.tekeli@bilgeadam.com

okan@okantekeli.com