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

Tamamlandı

T-SQL'de hataların doğası ve temel hata işleme hakkında bilgi edindiğinize göre, artık daha gelişmiş bir hata işleme biçimine bakmanın zamanı geldi: yapılandırılmış özel durum işleme.

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, sistem değişkenine göre hata işlemeden @@ERROR 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ı ve END TRY deyimleri ile BEGIN TRY çevrelenir.

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

Uyarı

ve END TRY ayrı deyimler olsa BEGIN CATCH da, hemen BEGIN CATCH izlemesi END TRYgerekir.

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ı ile yapabileceğinizden çok daha geniş bir hata aralığı yakalamanıza olanak sağlarken, her türü yakalayamadığınızı @@ERRORfark 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

Bazı hatalar hiçbir kapsamda yakalanmaz TRY/CATCH :

  • Önem derecesi 10 veya daha düşük olan bilgilendiren iletiler veya uyarılar.
  • Oturumun SQL Server Database Engine görevini durduran önem derecesi 20 veya üzeri hatalar.
  • Dikkatler: istemci kesme istekleri veya bozuk istemci bağlantıları.
  • Oturumlar sistem yöneticisi tarafından kullanılarak KILLsona erdi.

Diğer hatalar, öğesinin bulunduğu TRY/CATCH kapsamda yakalanmaz, ancak çevresindeki kapsamdaki bir TRY/CATCH tarafından yakalanabilir (örneğin, çağıran toplu işte veya saklı yordamda):

  • Derlenmeyi engelleyen söz dizimi hataları gibi derleme hataları.
  • Ertelenmiş ad çözümlemesi nedeniyle oluşan nesne adı çözümleme hataları; örneğin, henüz var olmayan bir tabloya başvuran bir saklı yordam. Hata yalnızca yordam çalışma zamanında adı çözümlemeye çalıştığında oluşturulur.

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ı belirtemese de, THROW CATCH bloğunda parametreler olmadan kullanıldığında hem sistem hem de kullanıcı hatalarını yeniden ele alır.

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

ile @@ERRORprogramlama yaparken sistem değişkeni tarafından tutulan değerin @@ERROR bir sonraki deyim yürütülür yürütülür yürütülz sıfırlandığını hatırlamalı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.

CATCH bloklarındaki işlemleri yönetme

Normalde bir bloğun dışındaki bir işlemi sonlandıran bir hata, hata bir TRY blok içinde gerçekleştiğinde işlemi olağan dışı bir TRY durumda bırakabilir. Yaygın olmayan bir işlem yalnızca okuma işlemleri veya veri ROLLBACK TRANSACTIONişleme veya değiştirme girişimleri başka bir hataya neden olur.

XACT_STATE() Geçerli işlemle ne yapacağını belirlemek için blokların içindeki CATCH işlevini kullanın:

  • XACT_STATE() = 1 — etkin, işlenebilir bir işlem vardır. veya ROLLBACKyapabilirsinizCOMMIT.
  • XACT_STATE() = 0 — etkin işlem yok. İşleme veya geri alma gerekmez.
  • XACT_STATE() = -1 — etkin ancak yaygın olmayan bir işlem var. ROLLBACKGerekir; işleme başarısız olur.

@@TRANCOUNT tek başına yaygın olmayan durumu algılayamaz, bu nedenle XACT_STATE() işlemleri yöneten CATCH blokları için önerilen denetimdir.

Kurallı CATCH bloğu deseni şöyledir:

BEGIN CATCH
    IF XACT_STATE() = -1
        ROLLBACK TRANSACTION;
    ELSE IF XACT_STATE() = 1
        COMMIT TRANSACTION;  -- or ROLLBACK, depending on intent

    THROW;  -- rethrow to caller
END CATCH;

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 bir RAISERROR T-SQL deyimi yürütmesi olabilir.