Share via


DENEYİN...catch (Transact-sql)

Implements hata işleme için Transact-SQL, özel durum işleme de benzer MicrosoftVisual C# ve MicrosoftVisual c++ dilleri. Bir grup Transact-SQLdeyimleri bir try bloğu içine. try bloğu içinde bir hata oluştuğunda, Denetim deyimleri bir catch bloğu alınmış başka bir grup geçirilir.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

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 Transact-SQLdeyimi.

  • statement_block
    Herhangi bir grup Transact-SQLdeyimleri toplu ya da başlamak içinde alınmışend bloğu.

Açıklamalar

TRY…catch yapısı veritabanı bağlantısı kapatmayın 10 yüksek bir önem sahip tüm yürütme hatalarını yakalar.

Bir try bloğunun hemen bir ilişkili catch bloğu tarafından izlenmesi gerekir. Bir diğer deyimleri arasındaki end try BEGIN catch deyimleri içeren bir sözdizimi hatası üretir.

TRY…catch yapısı birden çok toplu işlemi dağıtılamaz. TRY…catch yapısı can't span birden fazla blok Transact-SQLdeyimleri. Örneğin, a denemek…catch yapısı iki başlamak dağıtılamazSONUNDA blok Transact-SQLdeyimleri ve bir eğer... dağıtılamazBAŞKA yapı.

try bloğunun son deyiminde çalışması tamamlandığında, bir try bloğunda arasında bulunan kod hata yoksa, Denetim ilişkili end catch deyimi hemen sonraki deyime geçirir. Bir try bloğunun içine alınmış kodunda bir hata varsa, denetimin ilişkili catch bloğu içinde ilk deyim geçirir. end catch deyimi saklı yordam veya tetikleyiciyi içinde son ifade ise, Denetim geri için deyimi, saklı yordam adı veya tetikleyici harekete geçirilir.

Kod içinde catch bloğu bitirir denetim end catch deyimi hemen sonraki deyime aktarılır. Çağıran uygulama hataları catch bloğu tarafından yakalanan dönmedi. Hata bilgilerini herhangi bir bölümü uygulamaya döndürülmelidir, catch bloğu kodunu seçin sonuç kümeleri veya RAISERROR ve PRINT deyimleri gibi mekanizmalar kullanarak bunu gerekir.

TRY…catch yapıları yuvalanmış. try bloğu ya da bir catch bloğu iç içe try… içerebilircatch yapıları. Örneğin, katıştırılmış bir try… catch bloğu içerebilircatch yapı catch kodu tarafından karşılaşılan hataları işlemek için.

Başka bir yerde hatalar oluşturdu gibi bir catch bloğu hataların kabul edilir. İç içe try… catch bloğu içeriyorsacatch yapısı, yuvalanmış try bloğundaki herhangi bir hata denetimi yuvalanmış catch bloğuna geçecek. Eğer orada'hayır iç içe try…catch yapısı, hata çağırana geri gönderilir.

TRY…catch catch işlenemeyen hatalar saklı yordamlar veya Tetikleyiciler try bloğunda kodu tarafından yürütülen oluşturur. Alternatif olarak, saklı yordamlar veya Tetikleyiciler kendi try… içerebilirKendi kod tarafından oluşturulan hataları işlemek için yakalama oluşturur. Örneğin, try bloğundan saklı yordam yürütür ve saklı yordam hata oluşur hata aşağıdaki şekillerde yönetilebilir:

  • Saklı yordam kendi try… içermiyorsacatch yapısı, hata denetim execute deyimi içeren try bloğu ile ilişkili catch bloğu döner.

  • Saklı yordam içeren try…catch yapısı, hata saklı yordam catch bloğu denetim aktarır. catch bloğu kodunu sona erdiğinde kontrol sırt-e doğru hemen saklı yordam olarak adlandırılan execute deyiminden geçirilir.

goto ifadeleri, bir try veya catch bloğu girmek için kullanılamaz. goto ifadeleri aynı try veya catch bloğu içinde bir etiket atlamak ya da try veya catch bloğu bırakmak için kullanılır.

try…catch yapı, kullanıcı tanımlı bir işlev kullanılamaz.

Hata bilgileri alınıyor

Bir catch bloğu kapsamında yürütülecek catch bloğu neden hata hakkında bilgi edinmek için aşağıdaki sistem işlevleri kullanılabilir:

  • error_number() hata sayısını 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() içindeki hataya neden rutin satırın numarasını döndürür.

  • error_message(), hata iletisinin tam metni verir. Metin sağlanan uzunlukları, nesne adlarını veya süreleri gibi değiştirilebilir parametreler için değerler içerir.

catch bloğu kapsamı dışında çağrılırsa bu işlevleri, null döndürür. Adresinden alındı hata bilgisi her bir yerde--dan bu işlevleri kullanarak catch bloğu kapsamı içinde. Örneğin, aşağıdaki komut dosyası hata işleme işlevleri içeren bir saklı yordam gösterir. De CATCH, blok a TRY…CATCHYapı, saklı yordam adı verilir ve hata hakkında bilgi döner.

USE AdventureWorks2012;
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; 

USE AdventureWorks2012;
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; 

Hataları try… tarafından etkilenmezcatch yapı

TRY…catch yapıları, aşağıdaki koşullar tuzak değil:

  • Uyarıların veya bilgi iletilerinin 10 veya daha düşük bir önem sahip.

  • Bu Dur 20 veya daha yüksek bir önem sahip hataları SQL Server Veritabanı Altyapısıoturum için processing görevi. 20 Veya daha yüksek önem derecesi olan bir hata oluşur ve veritabanı bağlantısı kesintiye değil, try…catch hata idare edecek.

  • İstemci-kesme istekleri ya da kırık istemci bağlantıları gibi attentions.

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

Yürütme try… olarak aynı düzeyde oluştuğunda hataları aşağıdaki türde bir catch bloğu tarafından işlenmezcatch yapı:

  • Toplu çalışmasını engellemek sözdizimi hataları gibi hataları derleyin.

  • Sonra derleme ertelenmiş ad çözümlemesi nedeniyle oluşan nesne adı çözünürlüğü hataları gibi deyimi düzeyi recompilation sırasında oluşan hataları.

Bu hatalar, toplu iş, saklı yordam veya tetikleyiciyi çalıştırdığınız düzeyi döndürülür.

Derleme veya alt yürütme düzeyde deyimi düzeyi recompilation sırasında bir hata oluşursa (örneğin yürütürken sp_executesqlveya kullanıcı tanımlı bir saklı yordam) try bloğu içinde try… daha düşük bir düzeyde hata oluşur.Yapı yakalamak ve ilişkili catch bloğu tarafından işlenecek.

Nasıl bir nesne adı çözümlemesi hata oluşturduğu aşağıdaki örnekte gösterilmektedir bir SELECTdeyimi değil tarafından yakalanan TRY…CATCHinşa, ama tarafından yakalanan CATCHne zaman blok aynı SELECTdeyimi içinde saklı bir yordam yürütüldüğünde.

USE AdventureWorks2012;
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

USE AdventureWorks2012;
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 yakaladı ve kontrol dışarı geçer TRY…CATCHdaha yüksek seviyeye inşa.

Çalışan SELECTdeyimi içinde saklı bir yordam hata daha düşük bir düzeyde oluşmasına neden olacak TRYBlok. Hata tarafından ele TRY…CATCHconstruct.

-- 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;

-- 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;

Hareketleri ve xact_state uncommittable

Geçersiz için geçerli işlem durumunu bir try bloğu içinde oluşturulan hata neden oluyorsa, hareket uncommittable bir hareket olarak sınıflandırılır. Normalde biten bir try bloğunun dışında bir işlem hata try bloğu içinde hata oluştuğunda bir uncommittable durumuna girmek için harekete neden olur. Bir hareket uncommittable yalnızca okuma işlemleri veya rollback TRANSACTION gerçekleştirebilirsiniz. Herhangi bir işlem yürütülemiyor Transact-SQLyazma işlemi veya COMMIT TRANSACTION oluşturmak istiyorsunuz deyimleri. Eğer bir hareket uncommittable bir hareket olarak Sınıflandırılmamış xact_state işlev -1 değeri döndürür. Toplu işlem tamamlandığında, Veritabanı Altyapısıetkin uncommittable hareketleri geri alır. Toplu işlem tamamlandığında, hareket bir uncommittable durumuna girildiğinde hata ileti gönderilmedi, hata iletisi istemci uygulamasına gönderilir. Bu bir uncommittable hareketi tespit ve geri gösterir.

Uncommittable hareketleri ve xact_state işlevi hakkında daha fazla bilgi için bkz: xact_state (Transact-sql).

Örnekler

A.try… kullanmaYAKALAMAK

Aşağıdaki örnekte gösterildiği bir SELECTdeyimi tarafından sıfıra bölme hatası üretecektir. Hata ilişkili atlamak yürütülmesine neden CATCHBlok.

USE AdventureWorks2012;
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

USE AdventureWorks2012;
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.try… kullanmaBir hareket yakalamak

Aşağıdaki örnekte gösterildiği nasıl bir TRY…CATCHblok hareket içinde işleri. Deyimi içinde TRYbloğu oluşturur bir kısıtlama ihlali hatası.

USE AdventureWorks2012;
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

USE AdventureWorks2012;
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… kullanmacatch xact_state ile

Aşağıdaki örnek, nasıl kullanılacağını gösterir TRY…CATCHhareket içinde oluşan hataları işlemek için inşa etmek. XACT_STATEİşlevini belirleyen hareket tamamlandıktan veya geri alındı. Bu örnekte, SET XACT_ABORTolan ON. Kısıtlama ihlali hatası oluştuğunda bu hareket uncommittable yapar.

USE AdventureWorks2012;
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

USE AdventureWorks2012;
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

Ayrıca bkz.

Başvuru

throw (Transact-sql)

ERROR_LINE (Transact-sql)

error_message (Transact-sql)

error_number (Transact-sql)

error_procedure (Transact-sql)

ERROR_SEVERITY (Transact-sql)

error_state (Transact-sql)

RAISERROR (Transact-SQL)

@@ error (Transact-sql)

GOTO (Transact-sql)

BAŞLAR...SONUNDA (Transact-sql)

xact_state (Transact-sql)

set xact_abort (Transact-sql)

Kavramlar

Veritabanı Altyapısı hata Severities