Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Azure Synapse Analytics
Analiz Platformu Sistemi (PDW)
Microsoft Fabric'teki SQL analiz uç noktası
Microsoft Fabric'teki ambar
Microsoft Fabric'teki SQL veritabanı
C# ve Visual C++ dillerindeki özel durum işlemeye benzer Transact-SQL için hata işleme uygular. Bir grup Transact-SQL deyimi bir TRY bloğun içine eklenebilir. Blokta TRY bir hata oluşursa, denetim genellikle bir blok içine alınmış başka bir CATCH deyim grubuna geçirilir.
Transact-SQL söz dizimi kuralları
Syntax
BEGIN TRY
{ sql_statement | statement_block }
END TRY
BEGIN CATCH
[ { sql_statement | statement_block } ]
END CATCH
[ ; ]
Arguments
sql_statement
Herhangi bir Transact-SQL deyimi.
statement_block
Toplu olarak veya bir blok içine alınmış BEGIN...END Transact-SQL deyimleri grubu.
Remarks
Yapı TRY...CATCH , veritabanı bağlantısını kapatmadan önem derecesi 10'dan yüksek olan tüm yürütme hatalarını yakalar.
Bir TRY bloğun hemen ardından ilişkili CATCH bir bloğun izlenmesi gerekir. ve END TRY deyimleri arasında BEGIN CATCH başka deyimler de dahil olmak bir söz dizimi hatası oluşturur.
Bir TRY...CATCH yapı birden çok toplu işe yayılamaz. Bir TRY...CATCH yapı, Transact-SQL deyimlerinin birden çok bloğuna yayılamaz. Örneğin, bir TRY...CATCH yapı Transact-SQL deyimlerinin iki BEGIN...END bloğuna yayılamaz ve bir IF...ELSE yapıya yayılamaz.
Bir blok içine alınan kodda TRY hata yoksa, bloktaki TRY son deyim tamamlandığında, denetim ilişkili END CATCH deyimden hemen sonra deyimine geçer.
Kodda bir blok içine alınmış bir TRY hata varsa, denetim ilişkili CATCH bloktaki ilk deyime geçer. Bloktaki CATCH kod tamamlandığında, denetim deyiminden hemen sonra deyimine END CATCH geçer.
Note
END CATCH Deyimi saklı yordamdaki veya tetikleyicideki son deyimse, denetim saklı yordamı çağıran veya tetikleyiciyi tetikleyen deyime geri geçirilir.
Bir CATCH blok tarafından kapana kısılan hatalar, çağıran uygulamaya döndürülmüyor. Hata bilgilerinin herhangi bir bölümü uygulamaya döndürülmesi gerekiyorsa, bloktaki kodun CATCH bunu sonuç kümeleri veya SELECT ve RAISERROR deyimleri gibi PRINT mekanizmalar kullanarak yapması gerekir.
TRY...CATCH yapıları iç içe yerleştirilebilir. Blok TRY veya CATCH blok iç içe yapılar TRY...CATCH içerebilir. Örneğin, bir CATCH blok, kod tarafından TRY...CATCH karşılaşılan hataları işlemek için eklenmiş CATCH bir yapı içerebilir.
Bir CATCH blokta karşılaşılan hatalar, başka bir yerde oluşturulan hatalar olarak kabul edilir.
CATCH Blok iç içe TRY...CATCH bir yapı içeriyorsa, iç içe TRY bloktaki herhangi bir hata denetimi iç içe geçmiş CATCH bloğa geçirir. İç içe TRY...CATCH geçmiş bir yapı yoksa, hata çağırana geri geçirilir.
TRY...CATCH yapılar, bloktaki TRY kod tarafından yürütülen saklı yordamlardan veya tetikleyicilerden işlenmeyen hataları yakalar. Alternatif olarak, saklı yordamlar veya tetikleyiciler, kodları tarafından oluşturulan hataları işlemek için kendi TRY...CATCH yapılarını içerebilir. Örneğin, bir TRY blok saklı yordamı yürüttüğünde ve saklı yordamda bir hata oluştuğunda, hata aşağıdaki yollarla işlenebilir:
Saklı yordam kendi
TRY...CATCHyapısını içermiyorsa, hata denetimi deyiminiCATCHiçeren bloklaTRYilişkili bloğunaEXECUTEdöndürür.Saklı yordam bir
TRY...CATCHyapı içeriyorsa, hata denetimi saklı yordamdaki bloğaCATCHaktarır.CATCHBlok kodu tamamlandığında, denetim saklı yordamı çağıran deyimindenEXECUTEhemen sonra deyimine geri geçirilir.
GOTO deyimleri veya TRYCATCH bloğu girmek için kullanılamaz.
GOTOdeyimleri, aynı TRY veya blok içindeki bir etikete atlamak ya da ya CATCHTRY da CATCH blok bırakmak için kullanılabilir.
Yapı TRY...CATCH , kullanıcı tanımlı bir işlevde kullanılamaz.
Hata bilgilerini alma
Bir CATCH bloğun kapsamında, bloğun yürütülmesine neden CATCH olan hata hakkında bilgi almak için aşağıdaki sistem işlevleri kullanılabilir:
| Function | Description |
|---|---|
| ERROR_NUMBER | Hatanın sayısını döndürür. |
| ERROR_SEVERITY | Önem derecesini döndürür. |
| ERROR_STATE | Hata durumu numarasını döndürür. |
| ERROR_PROCEDURE | Hatanın oluştuğu saklı yordamın veya tetikleyicinin adını döndürür. |
| ERROR_LINE | Hataya neden olan yordamın içindeki satır numarasını döndürür. |
| ERROR_MESSAGE | Hata iletisinin tam metnini döndürür. Metin uzunluklar, nesne adları veya saatler gibi tüm alt güncelleştirilebilir parametreler için sağlanan değerleri içerir. |
Bu işlevler, bloğun NULL kapsamı dışında çağrılırsa geri dönerCATCH. Hata bilgileri, blok kapsamındaki CATCH her yerden bu işlevler kullanılarak alınabilir. Örneğin, aşağıdaki betik hata işleme işlevlerini içeren bir saklı yordam gösterir. Bir CATCH yapı bloğunda TRY...CATCH saklı yordam çağrılır ve hata hakkındaki bilgiler döndürülür.
-- 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;
İşlevler ERROR_* ayrıca CATCH içindeki bir blokta da çalışır.
TRY'den etkilenmeyen hatalar... CATCH yapısı
TRY...CATCH yapılar aşağıdaki koşulları yakalamaz:
Önem derecesi 10 veya daha düşük olan uyarılar veya bilgilendirme iletileri.
Oturum için SQL Server Veritabanı Altyapısı görev işlemesini durduran 20 veya üzeri önem derecesine sahip hatalar. Önem derecesi 20 veya daha yüksek olan bir hata oluşursa ve veritabanı bağlantısı kesintiye uğramadıysa,
TRY...CATCHhatayı işler.İstemci kesme istekleri veya bozuk istemci bağlantıları gibi dikkatler.
Sistem yöneticisi oturumu sonlandırmak için deyimini
KILLkullandığında.
Aşağıdaki hata türleri, yapıyla aynı yürütme CATCH düzeyinde gerçekleştiğinde bir TRY...CATCH blok tarafından işlenmez:
Toplu iş çalışmasını engelleyen söz dizimi hataları gibi derleme hataları.
Deyim düzeyinde yeniden derleme sırasında oluşan hatalar, örneğin, ertelenen ad çözümlemesi nedeniyle derlemeden sonra oluşan nesne adı çözümleme hataları.
Nesne adı çözümleme hataları
Bu hatalar toplu işlemi, saklı yordamı veya tetikleyiciyi çalıştıran düzeye döndürülür.
Derleme veya deyim düzeyinde yeniden derleme sırasında blok içinde sp_executesql daha düşük bir yürütme düzeyinde (örneğin, yürütürken TRY veya kullanıcı tanımlı bir saklı yordamda) bir hata oluşursa, hata yapıdan daha TRY...CATCH düşük bir düzeyde oluşur ve ilişkili CATCH blok tarafından işlenir.
Aşağıdaki örnekte, bir SELECT deyimi tarafından oluşturulan nesne adı çözümleme hatasının TRY...CATCH yapı tarafından yakalanmadığı, ancak aynı CATCH deyimin saklı yordam içinde yürütülürken blok tarafından SELECT nasıl yakalandığı gösterilmektedir.
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 yakalanmaz ve denetim yapıdan TRY...CATCH sonraki daha üst düzeye geçer.
deyimini SELECT saklı yordam içinde çalıştırmak, hatanın bloktan daha düşük bir düzeyde oluşmasına TRY neden olur. Hata yapısı tarafından TRY...CATCH işlenir.
-- 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;
Yaygın olmayan işlemler ve XACT_STATE
Bir blokta oluşturulan bir TRY hata geçerli işlemin durumunun geçersiz kılınma durumuna neden olursa, işlem yaygın olmayan bir işlem olarak sınıflandırılır. Normalde bir bloğun dışındaki bir işlemi sonlandıran bir hata, hata bir TRY bloğun içinde oluştuğunda işlemin olağan dışı bir TRY duruma girmesine neden olur. Yaygın olmayan bir işlem yalnızca okuma işlemleri veya bir ROLLBACK TRANSACTIONgerçekleştirebilir. İşlem, bir yazma işlemi veya COMMIT TRANSACTIONoluşturacak Transact-SQL deyimlerini yürütemez. İşlev, XACT_STATE bir işlemin yaygın olmayan bir -1 işlem olarak sınıflandırılmış olması durumunda değerini döndürür. Toplu işlem tamamlandığında, Veritabanı Altyapısı tüm etkin ve yaygın olmayan işlemleri geri alır. İşlem yaygın olmayan bir duruma girdiğinde hata iletisi gönderilmediyse, toplu işlem tamamlandığında istemci uygulamasına bir hata iletisi gönderilir. Bu, algılanmayan bir işlemin algılandığını ve geri alındığını gösterir.
Yaygın olmayan işlemler ve XACT_STATE işlev hakkında daha fazla bilgi için bkz. XACT_STATE.
Examples
A. TRY kullan... TUTMAK
Aşağıdaki örnekte sıfıra bölme hatası oluşturan bir deyim gösterilmektedir SELECT . Hata, yürütmenin ilişkili CATCH bloğa atlamasına neden olur.
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 kullan... Bir işlemde CATCH
Aşağıdaki örnekte bir bloğun TRY...CATCH bir işlem içinde nasıl çalıştığı gösterilmektedir. Bloğun TRY içindeki deyimi bir kısıtlama ihlali hatası oluşturur.
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 kullan... XACT_STATE ile CATCH
Aşağıdaki örnekte, bir işlem içinde oluşan hataları işlemek için yapısının nasıl kullanılacağı TRY...CATCH gösterilmektedir. işlevi, XACT_STATE işlemin işlenip işlenmeyeceğini veya geri alınıp alınmayacağını belirler. Bu örnekte, SET XACT_ABORT şeklindedir ON. Bu, kısıtlama ihlali hatası oluştuğunda işlemi kullanılamaz hale getirir.
-- 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.
-- You may want to commit a transaction in a catch block if you want to commit changes to statements that ran prior to the error.
IF (XACT_STATE()) = 1
BEGIN
PRINT N'The transaction is committable. Committing transaction.'
COMMIT TRANSACTION;
END;
END CATCH;
GO
İlgili içerik
- ATMA (Transact-SQL)
- Veritabanı Altyapısı hata önem dereceleri
- ERROR_LINE (Transact-SQL)
- ERROR_MESSAGE (Transact-SQL)
- ERROR_NUMBER (Transact-SQL)
- ERROR_PROCEDURE (Transact-SQL)
- ERROR_SEVERITY (Transact-SQL)
- HATA_DURUMU (Transact-SQL)
- RAISERROR (Transact-SQL)
- @@ERROR (Transact-SQL)
- GOTO (Transact-SQL)
- BAŞLAMAK... SON (Transact-SQL)
- XACT_STATE (Transact-SQL)
- SET XACT_ABORT (Transact-SQL)