Aracılığıyla paylaş


TRY...CATCH (Transact-SQL)

Uygulayan hata işleme için Transact-SQL için özel durum işleme de benzer Microsoft Visual C# ve Microsoft Visual c++ dilleri.Bir grup Transact-SQL ifadeleri alınmalıdır bir try blok.try blokiçinde bir hata ortaya çıkarsa, Denetim bir catch blokiçinde alınmış başka bir grup ifadeler geçirilir.

Konu bağlantısı simgesiTransact-SQL sözdizimi 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 Transact-SQL deyim.

  • statement_block
    Oluşan herhangi bir grubu Transact-SQL deyimleri toplu iş veya BEGIN… içineSon blok.

Açıklamalar

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

Bir try blok hemen bir ilişkili catch bloktarafından izlenmesi gerekir.end TRY'ile BAŞLAYAN catch deyimleri arasındaki diğer bir ifadeler de dahil olmak üzere, bir sözdizimi hatası üretir.

BİR TRY…catch yapı birden çok toplu işlemi yayılamaz.BİR TRY…catch yapı birden fazla bloklarını span Transact-SQL ifadeleri.Örneğin, bir try…catch yapı iki BEGIN… dağıtılamazSon bloklarını Transact-SQL ifadeleri ve bir IF… dağıtılamazBAŞKA yapýsý.

try blok son deyim çalışması tamamlandığında, bir try blokiçine alınmış kodda hata varsa, Denetim deyim hemen ilişkili end catch deyimgeçirir.Bir try blokiçine kodunda bir hata varsa, denetim ilişkili catch blokilk deyim geçirir.Son catch deyim saklı yordam veya tetikleyiciyi son deyim ise, Denetim saklı yordam olarak adlandırılan veya tetikleyici harekete geri deyim gönderilir.

catch blok kodunda sona erdiğinde, Denetim deyim hemen son catch deyimgeçirir.Çağıran uygulama hataları catch blok tarafından yakalanan dönmedi.Uygulama hata bilgilerini herhangi bir bölümünü iade edilmesi gerekir, catch blok kodunu select sonuç kümeleri veya RAISERROR ve PRINT deyimleri gibi mekanizmalarını kullanarak bunu gerekir.RAISERROR try… ile kullanma hakkında daha fazla bilgi içincatch Bkz: İşlemek için try...Transact-SQL'de catch.

TRY…catch yapıları yuvalanmış.blok try veya catch blok iç içe try… içerebilircatch yapıları.Örneğin, katıştırılmış bir try… catch blok içerebilircatch yapı catch koduyla karşılaşıldı hataları işlemek için.

Başka bir konumda hatalar oluşturdu gibi bir catch blok içinde karşılaşılan hataları kabul edilir.İç içe try… catch blok içeriyorsacatch yapısı yuvalanmış try blok herhangi bir hata denetimi yuvalanmış catch blokgeçecek.Hiçbir iç içe try… isecatch yapı, hata çaðýrana geri aktarýlýr.

TRY…catch catch işlenemeyen hatalar saklı yordamlar veya Tetikleyiciler kodu try bloktarafı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 catch yapıları.Örneğin, bir try blok , bir saklı yordam yürütür ve saklı yordambir hata oluşursa, aşağıdaki yollarla hata işlenebilir:

  • saklı yordam kendi try… içermiyorsacatch yapı denetimi execute deyimiçeren try blok ile ilişkili catch blok hatayı döndürür.

  • saklı yordam bir try… içeriyorsacatch yapı, hata denetimi saklı yordamcatch blok aktarır.catch blok kodunu sona erdiğinde, Denetim saklı yordamçağıran hemen execute deyim geri deyim gönderilir.

goto ifadeleri, bir try veya catch blokgirmek için kullanılamaz.goto ifadeleri aynı try veya catch blok içinde bir etiket atlamak veya bir try veya catch blokbırakmak için kullanılır.

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

Hata bilgileri alınıyor

kapsam bir catch blokiçinde yürütülecek catch blok nedeniyle oluşan 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 numarasıdöndürür.

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

  • ERROR_LINE() hataya yordam içindeki satır sayısını verir.

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

kapsam catch blokdışında çağrılmışsa bu işlevleri, null döndürür.Hata bilgisi alınan yerden bu işlevleri kullanarak catch blok kapsam içinde.Örneğin, aşağıdaki komut dosyası hata işleme işlevleri içeren bir saklı yordam göstermektedir.De CATCH blok , bir TRY…CATCH yapý, saklı yordam olarak adlandırılan ve hata hakkında bilgi döner.

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

try… tarafından etkilenmeden hatalarıcatch yapı

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

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

  • O durağın 20 veya daha yüksek bir önem sahip hataları SQL Server Veritabanı Altyapısı ' % s'oturum oturumiçin processing görevi.20 Veya daha yüksek önem derecesi olan bir hata oluşur ve veritabanı bağlantısı kesilmiş değil, try…catch hata işler.

  • istemcigibi attentions-kesme istekleri ya da kopuk istemci bağlantıları.

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

Yürütme try… olarak aynı düzey ortaya çıkan hataları aşağıdaki türde bir catch blok tarafından işlenmezcatch yapı:

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

  • deyim- sonra derleme ertelenmiş ad çözümlemesi nedeniyle oluşan nesne adı çözünürlüğü hataları gibidüzey yeniden derlemesinde sırasında oluşan hataları.

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

Derleme veya deyim-düzey yeniden derlemesinde alt düzey yürütme sırasında bir hata oluşursa (örneğin, yürütürken sp_executesql veya kullanıcı tanımlı bir saklı yordam) try blokiçinde try… daha alt düzey hata oluşur.catch yapı ve ilişkili catch bloktarafından işlenecek.Daha fazla bilgi için, bkz. İşlemek için try...Transact-SQL'de catch.

Aşağıdaki örnek tarafından nesne ad çözümleme hatası nasıl oluşturulacağını gösterir bir SELECTdeyim tarafından yakalanan değil TRY…CATCH oluşturmak, ancak tarafından yakalandı CATCHblok zaman aynı SELECT saklı yordamiçindedeyim yürütüldüğünde.

USE AdventureWorks2008R2;
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 yetersiz Denetim TRY…CATCH sonraki üst düzeyoluşturmak.

Çalışan SELECT deyim içinde bir saklı yordam hata düzey daha düşük oluşmasına neden olur TRY blok.Hata tarafından ele TRY…CATCH yapısı.

-- 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 kılınan için geçerli işlem durumunu bir try blok içinde oluşturulan hata neden olursa, hareket olarak sınıflandırılmış bir yürütülemeyen hareket.Girmek bir işlem normalde bir try blok dışında bir hareket biten bir hata neden bir yürütülemeyen try blokiçinde hata ortaya çıktığında durumu.Bir yürütülemeyen hareket okuma işlemleri veya rollback İŞLEMİNİ yalnızca gerçekleştirebilir.Hareket yürütmek any olamaz Transact-SQL deyimleri yazma işlemi veya oluşturmakbir TAMAMLAMA hareket.Bir hareket olarak sınıflandırılmış, xact_state işlev -1 değerini döndürür bir yürütülemeyen hareket.toplu iş tamamlandığında, Veritabanı Altyapısı etkin geri alınır yürütülemeyen hareketleri.Hareket girdiğinizde hata iletisi gönderilip gönderilmediğini bir yürütülemeyen durumuna, toplu iş sona erdiğinde, bir hata iletisi gönderilecek istemci uygulama.Bunu belirten bir yürütülemeyen hareket algılandı ve geri alındı.

Hakkında daha fazla bilgi için yürütülemeyen hareketleri ve xact_state işlevgörmek İşlemek için try...Transact-SQL'de catch ve xact_state (Transact-SQL).

Örnekler

A.try… kullanmaCATCH

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

USE AdventureWorks2008R2;
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 işleme catch

Aşağıdaki örnekte gösterildiği nasıl bir TRY…CATCH blok , bir işlem içinde çalışır.' % S'deyimi deyim içinde TRY blok oluşturur bir kısıtlama ihlali hatası.

USE AdventureWorks2008R2;
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…CATCH yapısı işlemek hatalar oluşan içinde hareket.XACT_STATEişlev hareketin kabul edilen veya geri alınmış olup olmadığını belirler. Bu örnekte, SET XACT_ABORT olan ON.Bu hareketi yapan yürütülemeyen kısıtlama ihlali hatası ortaya çıktığında.

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