Microsoft SQL Server
पकड़ने की कोशिश
खोज…
टिप्पणियों
TRY / CATCH MS SQL सर्वर के T-SQL के लिए विशिष्ट भाषा निर्माण है।
यह टी-एसक्यूएल के भीतर त्रुटि से निपटने की अनुमति देता है, जो .NET कोड में देखा गया है।
एक TRY / CATCH में लेनदेन
यह अमान्य डेटाटाइम के कारण दोनों आवेषणों को रोलबैक करेगा:
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, GETDATE(), 1)
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, 'not a date', 1)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION -- First Rollback and then throw.
THROW
END CATCH
यह दोनों आवेषण करेगा:
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, GETDATE(), 1)
INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
VALUES (5.2, GETDATE(), 1)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
THROW
ROLLBACK TRANSACTION
END CATCH
ट्राई-कैच ब्लॉक में त्रुटियों को उठाना
RAISERROR फ़ंक्शन TRY CATCH ब्लॉक में त्रुटि उत्पन्न करेगा:
DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
print 'First statement';
RAISERROR(@msg, 11, 1);
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
END CATCH
RAISERROR दूसरे पैरामीटर के साथ 10 से अधिक (इस उदाहरण में 11) TRY BLOCK में निष्पादन को रोक देगा और एक त्रुटि को उठाएगा जो CATCH ब्लॉक में संभाला जाएगा। आप ERROR_MESSAGE () फ़ंक्शन का उपयोग करके त्रुटि संदेश तक पहुंच सकते हैं। इस नमूने का आउटपुट है:
First statement
Error: Here is a problem!
ट्राई कैच ब्लॉक में सूचना संदेश जुटाना
RAISERROR की गंभीरता (दूसरा पैरामीटर) 10 के बराबर या उससे कम नहीं है।
BEGIN TRY
print 'First statement';
RAISERROR( 'Here is a problem!', 10, 15);
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
END CATCH
RAISERROR स्टेटमेंट के बाद, तीसरे स्टेटमेंट को निष्पादित किया जाएगा और CATCH ब्लॉक को लागू नहीं किया जाएगा। निष्पादन का परिणाम है:
First statement
Here is a problem!
Second statement
RAISERROR द्वारा उत्पन्न अपवाद फिर से फेंकना
आप TRHOW स्टेटमेंट का उपयोग करके CATCH ब्लॉक में त्रुटि को फिर से फेंक सकते हैं:
DECLARE @msg nvarchar(50) = 'Here is a problem! Area: ''%s'' Line:''%i'''
BEGIN TRY
print 'First statement';
RAISERROR(@msg, 11, 1, 'TRY BLOCK', 2);
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
THROW;
END CATCH
ध्यान दें कि इस मामले में हम स्वरूपित तर्कों (चौथे और पांचवें पैरामीटर) के साथ त्रुटि उठा रहे हैं। यदि आप संदेश में अधिक जानकारी जोड़ना चाहते हैं तो यह उपयोगी हो सकता है। निष्पादन का परिणाम है:
First statement
Error: Here is a problem! Area: 'TRY BLOCK' Line:'2'
Msg 50000, Level 11, State 1, Line 26
Here is a problem! Area: 'TRY BLOCK' Line:'2'
TRY / CATCH ब्लॉकों में अपवाद फेंकना
आप अपवाद को पकड़ने की कोशिश ब्लॉक में फेंक सकते हैं:
DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
print 'First statement';
THROW 51000, @msg, 15;
print 'Second statement';
END TRY
BEGIN CATCH
print 'Error: ' + ERROR_MESSAGE();
THROW;
END CATCH
CATCH ब्लॉक में संभाला जा सकता है और फिर पैरामीटर के बिना THROW का उपयोग करके फिर से फेंक दिया जाता है।
First statement
Error: Here is a problem!
Msg 51000, Level 16, State 15, Line 39
Here is a problem!
निम्नलिखित अंतर के साथ THROW RAISERROR के समान है:
- सिफारिश यह है कि नए अनुप्रयोगों को RASIERROR के बजाय THROW का उपयोग करना चाहिए।
- THROW किसी भी संख्या को पहले तर्क (त्रुटि संख्या) के रूप में उपयोग कर सकते हैं, RAISERROR केवल आईडी का उपयोग sys.morages में देख सकते हैं
- THROW में गंभीरता 16 है (बदला नहीं जा सकता)
- THROW RAISERROR जैसे तर्कों को प्रारूपित नहीं कर सकता है। यदि आपको इस सुविधा की आवश्यकता है, तो RAISERROR के तर्क के रूप में FORMATMESSAGE फ़ंक्शन का उपयोग करें।