Yapılandırılmış özel durum işleme uygulama

Tamamlandı

Artık T-SQL'de hataların niteliğini ve temel hata işlemeyi anladığınıza göre, hata işlemenin daha gelişmiş bir biçimine bakmanın zamanı geldi. Yapılandırılmış özel durum işleme, SQL Server 2005'te kullanıma sunulmuştur.

Burada, TRY CATCH bloğu, hata işleme işlevlerinin rolü ve yakalanabilir ve düzeltilemez hatalar arasındaki farkı anlama gibi avantajlarını ve sınırlamalarını nasıl kullanacağınızı göreceksiniz. Son olarak, gerektiğinde hataların nasıl yönetilebileceğini ve ortaya çıkarılabildiğini göreceksiniz.

TRY/CATCH blok programlama nedir?

Yapılandırılmış özel durum işleme, @@ERROR sistem değişkenine göre hata işlemeden daha güçlüdür. Kodun hata işleme koduyla çöpe atılmasını önlemenizi ve bu hata işleme kodunu merkezileştirmenizi sağlar. Hata işleme kodunun merkezileştirilmesi, içerdiği hata işleme yerine kodun amacına daha fazla odaklanabileceğiniz anlamına gelir.

TRY bloğu ve CATCH bloğu

Yapılandırılmış özel durum işleme kullanılırken, hata oluşturabilecek kod bir TRY bloğuna yerleştirilir. TRY blokları BEGIN TRY ve END TRY deyimleriyle çevrelenir.

Yakalanabilir bir hata oluşursa - çoğu hata yakalanabilir, yürütme denetimi CATCH bloğuna taşınır. CATCH bloğu, BEGIN CATCH ve END CATCH deyimleriyle çevrelenen bir dizi T-SQL deyimidir.

Uyarı

BEGIN CATCH ve END TRY ayrı deyimler olsa da BEGIN CATCH hemen END TRY'yi izlemelidir.

Mevcut sınırlamalar

Üst düzey diller genellikle bir try/catch/finally yapısı sunar ve genellikle kaynakları örtük olarak serbest bırakmak için kullanılır. T-SQL'de eşdeğer FINALLY bloğu yoktur.

Yakalanabilir ve düzeltilemez hatalar arasındaki farkı anlama

TRY/CATCH blokları, @@ERROR ile yakalayabileceğinizden çok daha geniş bir hata aralığı yakalamanıza olanak sağlarken, her türü yakalayamadığınızı fark etmek önemlidir.

Yakalanabilir ve yakalanamayan hatalar

TRY/CATCH bloğunun yer aldığı aynı kapsam içinde TRY/CATCH blokları tarafından tüm hatalar yakalanamayabilir. Genellikle, aynı kapsamda yakalanamayan hatalar, çevresindeki bir kapsamda yakalanabilir. Örneğin, TRY/CATCH bloğunu içeren saklı yordamda bir hata yakalayamayabilirsiniz. Ancak, hatanın oluştuğu saklı yordamı çağıran koddaki TRY/CATCH bloğunda bu hatayı yakalama olasılığınız vardır.

Sık karşılaşılan yakalanamaz hatalar

Eşleşmez hatalara yaygın örnekler şunlardır:

  • Derlenmeyi engelleyen söz dizimi hataları gibi derleme hataları.
  • Genellikle ertelenen ad çözümlemesi ile ilgili ifade düzeyi yeniden derleme sorunları. Örneğin, bilinmeyen bir tabloya başvuran bir saklı yordam oluşturabilirsiniz. Hata, yalnızca yordam tablonun adını bir objectid olarak çözümlemeye çalıştığında oluşur.

THROW kullanarak hataları yeniden fırlatma

THROW deyimi herhangi bir parametre olmadan bir CATCH bloğunda kullanılırsa, kodun CATCH bloğuna girmesine neden olan hatayı yeniden oluşturur. Hataları yakalayıp ayrıntılarını günlüğe kaydederek ve ardından özgün hatayı istemci uygulamasına ekleyerek veritabanında hata günlüğünü uygulamak için bu tekniği kullanabilirsiniz.

Bir hatayı yeniden oluşturma örneği aşağıda verilmiştir.

BEGIN TRY
    -- code to be executed
END TRY
BEGIN CATCH
    PRINT ERROR_MESSAGE();
    THROW
END CATCH

SQL Server'ın önceki bazı sürümlerinde sistem hatası oluşturma yöntemi yoktu. THROW, yükseltilecek bir sistem hatası belirleyemese de, bir CATCH bloğunda parametreler olmadan kullanıldığında hem sistem hem de kullanıcı hatalarını yeniden yükseltir.

Hata işleme işlevleri nelerdir?

CATCH blokları, hatayla ilgili bilgileri CATCH bloğunun süresi boyunca kullanılabilir hale getirir. CATCH bloğunun içinden çalıştırılan saklı yordamlar gibi altkapsamları içerir.

Hata işleme işlevleri

@@ERROR ile programlama yaparken, @@ERROR sistem değişkeni tarafından tutulan değerin bir sonraki deyim yürütülür yürütülmez sıfırlandığını unutmamalısınız.

T-SQL'de yapılandırılmış özel durum işlemenin bir diğer önemli avantajı, bir dizi hata işleme işlevinin sağlanmış olması ve bunların değerlerini CATCH bloğu boyunca tutmasıdır. Ayrı işlevler, tetiklenen bir hatanın her özelliğini sağlar.

Bu, hata ile ilgili bilgilere erişmeye devam eden genel amaçlı hata işleme saklı yordamları yazabileceğiniz anlamına gelir.

  • CATCH blokları, hatayla ilgili bilgileri CATCH bloğunun süresi boyunca kullanılabilir hale getirir.
  • Bir sonraki deyim çalıştırıldığında, @@Error sıfırlanır.

Koddaki hataları yönetme

SQL CLR tümleştirmesi, SQL Server içinde yönetilen kodun yürütülmesini sağlar. C# ve VB gibi üst düzey .NET dillerinin kullanabileceği ayrıntılı özel durum işleme özelliği vardır. Hatalar standart .NET try/catch/finally blokları kullanılarak yakalanabilir.

Yönetilen koddaki hatalar

Genel olarak, yönetilen koddaki hataları mümkün olduğunca yakalamak isteyebilirsiniz. Bununla birlikte, yönetilen kodda işlenmeyen hataların çağıran T-SQL koduna geri geçirildiğini fark etmek önemlidir. Yönetilen kodda oluşan herhangi bir hata SQL Server'a döndürülürse, 6522 hatası gibi görünür. Hatalar iç içe geçmiş olabilir ve bu belirli hata, gerçek hatanın nedenini gizleyebilir.

Yönetilen koddaki hataların bir diğer nadir ancak olası nedeni, kodun sqlcommand nesnesi aracılığıyla RAISERROR T-SQL deyimi yürütmesi olabilir.