Aracılığıyla paylaş


... CATCH (Transact-SQL) TRY

Için ımplements hata Transact-SQL özel durum, işleme için benzeyen Microsoft Visual C# ve Microsoft Visual C++ diller. Bir Grup Transact-SQL bir TRY blok içinde içine ifadeleri. TRY blok içinde bir hata ortaya çıkarsa, denetimi, bir CATCH blok içinde başka bir grup ekstrelerinin geçirilir.

Topic link iconTransact-SQL sözdizimi kuralları

BEGIN TRY
     { sql_statement | statement_block }
END TRY
BEGIN CATCH
          [ { sql_statement | statement_block } ]
END CATCH
[ ; ]

Bağımsız değişkenler

  • sql_statement
    Herhangi bir iş Transact-SQL deyim.

  • statement_block
    Herhangi bir grubu Transact-SQL bir toplu iş deyimlerinde veya bir BEGIN…END içine blok.

Remarks

Bir TRY…CATCH yapısı veritabanı bağlantısını kapatın, 10'dan daha büyük bir önem olan tüm yürütme hatalarını yakalar.

TRY blok hemen ile ilişkili bir CATCH blok gelmelidir.Tüm diğer tabloları arasındaki END TRY BEGIN CATCH ifadeleri dahil, bir sözdizimi hatası üretir.

Birden çok toplu işlem, BIR TRY…CATCH yapýsý dağıtılamaz.Bir TRY…CATCH yapı blokları birden çok dağıtılamaz Transact-SQL ifadeler. Örneğin, iki BEGIN…END bloklarını bir TRY…CATCH yapýsý dağıtılamaz Transact-SQL ifadeler ve bir IF…ELSE yapı dağıtılamaz.

TRY blok son deyimde çalışmasını bitirdiğinde, bir TRY blok içinde kodunda hata varsa, Denetim deyim hemen ilişkili END CATCH deyiminden sonraki deyime geçirir.Denetim bir TRY blok içine kodunda bir hata varsa, ilgili CATCH blok içinde ilk deyim geçirir.END CATCH, deyim son deyim bir saklı yordam veya tetikleyiciyi denetimi geri geçirilir deyim saklı yordamın adı verilen veya tetikleyici harekete geçirildi.

Zaman kodu CATCH blok tamamladığında, Denetim geçer Sonraki hemen END CATCH deyimsi.Çağrıyı yapan uygulamaya bir CATCH blok tarafından yakalanan bir hata döndürülür.Uygulamaya hata bilgilerini bir kısmını döndürdü, CATCH blok içinde kod SELECT sonuç kümeleri ya da RAISERROR ve PRINT ifadeleri mekanizmaları kullanarak bunu gerekir.RAISERROR TRY…CATCH ile kullanma hakkında daha fazla bilgi için bkz: Kullanarak TRY... CATCH Transact-SQL'DE.

TRY…CATCH yapıları iç içe kullanılabilir.TRY blok ya da bir CATCH blok iç içe geçmiş TRY…CATCH yapıları içerebilir.Örneğin, bir CATCH blok CATCH kodun karşılaşılan hataları işlemek için katıştırılmış bir TRY…CATCH yapı içerebilir.

Hata başka herhangi bir oluşturulan gibi bir CATCH blok içinde hataların kabul edilir.Iç içe geçmiş TRY blok içinde herhangi bir hata denetimi, CATCH blok iç içe geçmiş bir TRY…CATCH yapýsý içeriyorsa, iç içe geçmiş CATCH blok geçirir.Hata, hiçbir iç içe geçmiş TRY…CATCH yapýsý ise, arayan kişiye geçirilir.

Saklı yordamlar veya TRY kodu tarafından çalıştırılan Tetikleyicileri çözülmemiş TRY…CATCH yapıları catch blok.Alternatif olarak, saklı yordamlar veya Tetikleyicileri, kod tarafından oluşturulan hataları işlemek için kendi TRY…CATCH yapıları içerebilir.Örneğin, bir TRY blok bir saklı yürütür yordam ve bir hata oluşur saklı yordamda hata aşağıdaki şekillerde yönetilebilir:

  • saklı yordam kendi TRY…CATCH yapýsý içermiyorsa, hata denetimi yürütmek deyim içeren TRY blok ile ilgili CATCH blok döndürür.

  • saklı yordam bir TRY…CATCH yapýsý içeriyorsa, hata denetimi için CATCH aktarımları blok saklı yordam.CATCH blok kod sona erdiğinde, denetimi yeniden deyim saklı yordam adı verilen yürütmek deyim hemen sonra geçirilir.

GOTO ifadeleri TRY veya CATCH blok girmek için kullanılamaz.GOTO deyimleri aynı TRY veya CATCH blok içinde bir etiket atlamak veya bir TRY veya CATCH bloğunun bırakmak için kullanılır.

TRY…CATCH yapýsý, kullanıcı tanımlı bir işlev kullanılamaz.

Hata bilgisi alınıyor

Içinde kapsam CATCH blok, aşağıdaki sistem işlevleri yürütülecek CATCH blok neden hata hakkında bilgi almak için kullanılabilir:

  • ERROR_NUMBER() hata verir.

  • ERROR_SEVERITY() önem verir.

  • ERROR_STATE() hata durumu döndürür.

  • ERROR_PROCEDURE(), hatanın oluştuğu saklı yordam veya tetikleyiciyi adını döndürür.

  • ERROR_LINE() hataya neden olan bir yordam içinde satır numarasını verir.

  • ERROR_MESSAGE(), hata iletisinin tam metni verir.Metni gibi uzunlukları, nesne adları veya zamanları, değiştirilebilir parametreleri için sağlanan değerler içerir.

Bu işlevler kapsam dışında bir CATCH blok olarak NULL dön.Hata bilgileri, herhangi bir bu işlevleri kullanarak alınabilmesi kapsamındaki CATCH blok.Örneğin, aşağıdaki komut dosyası hata işleme işlevleri içeren saklı yordam gösterir.Içinde CATCH blok, bir TRY…CATCH Yapı, saklı yordam adı verilir ve bu hata hakkında bilgi verilir.

USE AdventureWorks;
GO
-- Verify that the stored procedure does not already exist.
IF OBJECT_ID ( 'usp_GetErrorInfo', 'P' ) IS NOT NULL 
    DROP PROCEDURE usp_GetErrorInfo;
GO

-- Create procedure to retrieve error information.
CREATE PROCEDURE usp_GetErrorInfo
AS
SELECT
    ERROR_NUMBER() AS ErrorNumber
    ,ERROR_SEVERITY() AS ErrorSeverity
    ,ERROR_STATE() AS ErrorState
    ,ERROR_PROCEDURE() AS ErrorProcedure
    ,ERROR_LINE() AS ErrorLine
    ,ERROR_MESSAGE() AS ErrorMessage;
GO

BEGIN TRY
    -- Generate divide-by-zero error.
    SELECT 1/0;
END TRY
BEGIN CATCH
    -- Execute error retrieval routine.
    EXECUTE usp_GetErrorInfo;
END CATCH;

Bir TRY…CATCH yapýsý etkilenmeyen hataları

TRY…CATCH yapıları aşağıdaki koşullar yakalama:

  • Uyarılar veya 10 veya daha düşük bir önem bilgilendirme iletileri.

  • Bu Dur 20 veya daha yüksek önem derecesi olan hatalar SQL Server Database Engine Görev için oturum işleniyor. Hata 20 veya daha yüksek olan oluşur ve veritabanı bağlantısı olmayan bozulur, TRY…CATCH hata işleyecektir.

  • Istemci kesme istekleri ya da bozuk istemci bağlantıları attentions.

  • Ne zaman oturum KILL kullanarak bir sistem yöneticisi tarafından sonlandırılır deyim.

Aynı anda ortaya çıktığında aşağıdaki hata türlerini bir CATCH blok işlenmez düzey yürütmenin TRY…CATCH yapýsý olarak:

  • Bir toplu iş çalışmasını engelleyebilecek sözdizimi hataları gibi hataları derleyin.

  • Sırasında oluşan hataları deyim-düzey recompilation, sonra derleme ertelenen ad çözümlemesi nedeniyle oluşan nesne adı çözümlemesi hataları gibi.

Bu hatalar için döndürülen düzey, toplu iş, saklı yordam veya tetikleyiciyi bitti.

Derleme veya alt düzeyde bir yürütme (örneğin yürütürken, Tablo düzey recompilation sırasında bir hata oluştuğunda Sp_executesql veya kullanıcı tanımlı saklı yordam) TRY blok içine hata TRY…CATCH yapýsý daha alt düzeyde gerçekleşir ve ilişkili CATCH blok işlenecek.Daha fazla bilgi için bkz:Kullanarak TRY... CATCH Transact-SQL'DE.

Aşağıdaki örnek, nasıl bir nesne adı çözümlemesi hata oluşturulan gösterir bir SELECT deyim tarafından yakalanan TRY…CATCH oluşturma, ancak tarafından yakalanan iletiler CATCH ne zaman engellemek aynı SELECT deyimi, saklı bir yordam içinde yürütülür.

USE AdventureWorks;
GO

BEGIN TRY
    -- Table does not exist; object name resolution
    -- error not caught.
    SELECT * FROM NonexistentTable;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH

Hata değil yakalandı ve geçiş dışında kontrol TRY…CATCH daha yüksek düzeydeki için oluşturun.

Çalışan SELECT deyim içinde bir saklı yordam hata, daha düşük bir düzeyde oluşmasına neden olacak TRY blok. Hata tarafından ele TRY…CATCH oluşturun.

-- Verify that the stored procedure does not exist.
IF OBJECT_ID ( N'usp_ExampleProc', N'P' ) IS NOT NULL 
    DROP PROCEDURE usp_ExampleProc;
GO

-- Create a stored procedure that will cause an 
-- object resolution error.
CREATE PROCEDURE usp_ExampleProc
AS
    SELECT * FROM NonexistentTable;
GO

BEGIN TRY
    EXECUTE usp_ExampleProc;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
  • Toplu işlemi hakkında daha fazla bilgi için bkz: Toplu işlemi.

Hareketleri ve XACT_STATE yürütülemeyen

Geçersiz kılınan için geçerli hareket durumunu bir TRY blok içinde oluşturulan, hataya neden olursa, hareket yürütülemeyen bir işlem olarak sınıflandırılır.Hata, genellikle bir TRY bloğunun dışına bir hareketi sona erdirir TRY blok hata ortaya çıktığında bir yürütülemeyen durumu girmek bir hareket neden olur.yürütülemeyen bir işlemin, yalnızca okuma işlemleri veya bir ROLLBACK TRANSACTION gerçekleştirebilirsiniz.Tüm işlem yürütülemiyor Transact-SQL deyimleri yazma işlemi veya yürütmek bir TRANSACTION oluşturmak. Bir hareket yürütülemeyen bir işlem olarak sınıflandırılmış XACT_STATE işlev -1 değeri verir.toplu iş iş iş tamamlandığında, Database Engine tüm etkin yürütülemeyen işlemleri'ne geri alır. toplu iş iş iş tamamlandığında yürütülemeyen durumu, hareket girdiğinizde hata iletisi gönderildi istemci uygulamasına bir hata iletisi gönderilir.Bu, bir yürütülemeyen hareket algıladı ve geri gösterir.

yürütülemeyen hareketleri ve XACT_STATE işlev hakkında daha fazla bilgi için bkz: Kullanarak TRY... CATCH Transact-SQL'DE ve XACT_STATE (Transact-SQL).

Örnekler

C.TRY…CATCH kullanma

Aşağıdaki örnekte gösterildiği bir SELECT deyim bir sıfıra bölme hatası üretecektir. Hata ilişkili atlamak yürütme neden olur. CATCH blok.

USE AdventureWorks;
GO

BEGIN TRY
    -- Generate a divide-by-zero error.
    SELECT 1/0;
END TRY
BEGIN CATCH
    SELECT
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH;
GO

b.Bir işlemde TRY…CATCH kullanma

Aşağıdaki örnekte gösterildiği nasıl bir TRY…CATCH bir işlem içinde çalışır engelleyin. deyim içinde TRY blok, bir kısıtlama ihlali hatası üretir.

USE AdventureWorks;
GO
BEGIN TRANSACTION;

BEGIN TRY
    -- Generate a constraint violation error.
    DELETE FROM Production.Product
    WHERE ProductID = 980;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
END CATCH;

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;
GO

c.TRY…CATCH XACT_STATE ile kullanma

Aşağıdaki örnek, nasıl kullanacağınızı gösterir TRY…CATCH bir hareket içinde oluşan hataları işlemek için bu seçeneği oluşturun. The XACT_STATE işlev determines whether the transaction should be committed or rolled back. Bu örnekte, SET XACT_ABORT olan ON. Bu, hareketi yürütülemeyen yapar, kısıtlama ihlali hatası oluştuğunda.

USE AdventureWorks;
GO

-- Check to see whether this stored procedure exists.
IF OBJECT_ID (N'usp_GetErrorInfo', N'P') IS NOT NULL
    DROP PROCEDURE usp_GetErrorInfo;
GO

-- Create procedure to retrieve error information.
CREATE PROCEDURE usp_GetErrorInfo
AS
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_LINE () AS ErrorLine
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_MESSAGE() AS ErrorMessage;
GO

-- SET XACT_ABORT ON will cause the transaction to be uncommittable
-- when the constraint violation occurs. 
SET XACT_ABORT ON;

BEGIN TRY
    BEGIN TRANSACTION;
        -- A FOREIGN KEY constraint exists on this table. This 
        -- statement will generate a constraint violation error.
        DELETE FROM Production.Product
            WHERE ProductID = 980;

    -- If the DELETE statement succeeds, commit the transaction.
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    -- Execute error retrieval routine.
    EXECUTE usp_GetErrorInfo;

    -- Test XACT_STATE:
        -- If 1, the transaction is committable.
        -- If -1, the transaction is uncommittable and should 
        --     be rolled back.
        -- XACT_STATE = 0 means that there is no transaction and
        --     a commit or rollback operation would generate an error.

    -- Test whether the transaction is uncommittable.
    IF (XACT_STATE()) = -1
    BEGIN
        PRINT
            N'The transaction is in an uncommittable state.' +
            'Rolling back transaction.'
        ROLLBACK TRANSACTION;
    END;

    -- Test whether the transaction is committable.
    IF (XACT_STATE()) = 1
    BEGIN
        PRINT
            N'The transaction is committable.' +
            'Committing transaction.'
        COMMIT TRANSACTION;   
    END;
END CATCH;
GO