संरचित अपवाद हैंडलिंग लागू करें
अब जब आपको टी-एसक्यूएल में त्रुटियों की प्रकृति और बुनियादी त्रुटि हैंडलिंग की समझ है, तो यह त्रुटि हैंडलिंग के अधिक उन्नत रूप को देखने का समय है। संरचित अपवाद हैंडलिंग SQL Server 2005 में प्रस्तुत किया गया था।
यहां, आप देखेंगे कि इसका उपयोग कैसे करें और इसके लाभों और सीमाओं का मूल्यांकन करें, जिसमें TRY CATCH ब्लॉक, त्रुटि हैंडलिंग कार्यों की भूमिका और पकड़ने योग्य और गैर-पकड़ने योग्य त्रुटियों के बीच अंतर को समझना शामिल है। अंत में, आप देखेंगे कि त्रुटियों को कैसे प्रबंधित किया जा सकता है और आवश्यक होने पर सामने आ सकता है।
TRY/CATCH ब्लॉक प्रोग्रामिंग क्या है
संरचित अपवाद हैंडलिंग @@ERROR सिस्टम चर के आधार पर त्रुटि हैंडलिंग से अधिक शक्तिशाली है। यह आपको कोड को त्रुटि हैंडलिंग कोड से अटे पड़ने से रोकने और उस त्रुटि हैंडलिंग कोड को केंद्रीकृत करने की अनुमति देता है। त्रुटि हैंडलिंग कोड के केंद्रीकरण का अर्थ यह भी है कि आप इसमें शामिल त्रुटि हैंडलिंग के बजाय कोड के उद्देश्य पर अधिक ध्यान केंद्रित कर सकते हैं।
ब्लॉक और कैच ब्लॉक का प्रयास करें
संरचित अपवाद हैंडलिंग का उपयोग करते समय, कोड जो त्रुटि बढ़ा सकता है उसे TRY ब्लॉक के भीतर रखा जाता है। TRY ब्लॉक BEGIN TRY और END TRY स्टेटमेंट द्वारा संलग्न हैं।
क्या एक पकड़ने योग्य त्रुटि होनी चाहिए - अधिकांश त्रुटियों को पकड़ा जा सकता है, निष्पादन नियंत्रण कैच ब्लॉक में चला जाता है। CATCH ब्लॉक BEGIN CATCH और END CATCH स्टेटमेंट से घिरे T-SQL स्टेटमेंट की एक श्रृंखला है।
नोट
जबकि BEGIN CATCH और END TRY अलग-अलग कथन हैं, BEGIN CATCH को तुरंत END TRY का पालन करना चाहिए।
वर्तमान सीमाएँ
उच्च-स्तरीय भाषाएं अक्सर एक कोशिश/कैच/अंत में निर्माण की पेशकश करती हैं, और अक्सर संसाधनों को अप्रत्यक्ष रूप से जारी करने के लिए उपयोग की जाती हैं। T-SQL में कोई समतुल्य FINALLY ब्लॉक नहीं है।
पकड़ने योग्य और गैर-पकड़ने योग्य त्रुटियों के बीच अंतर को समझें
यह महसूस करना महत्वपूर्ण है कि, जबकि TRY/CATCH ब्लॉक आपको @@ERROR की तुलना में त्रुटियों की एक विस्तृत श्रृंखला को पकड़ने की अनुमति देते हैं, आप हर प्रकार को नहीं पकड़ सकते।
पकड़ने योग्य बनाम गैर-पकड़ने योग्य त्रुटियां
सभी त्रुटियों को TRY/CATCH ब्लॉक द्वारा उसी दायरे में नहीं पकड़ा जा सकता है जहां TRY/CATCH ब्लॉक मौजूद है। अक्सर, त्रुटियां जिन्हें एक ही दायरे में नहीं पकड़ा जा सकता है, उन्हें आसपास के दायरे में पकड़ा जा सकता है। उदाहरण के लिए, आप TRY/CATCH ब्लॉक में संग्रहीत कार्यविधि में कोई त्रुटि पकड़ने में सक्षम नहीं हो सकता है। हालाँकि, आप उस त्रुटि को कोड में TRY/CATCH ब्लॉक में पकड़ने की संभावना रखते हैं जिसे संग्रहीत प्रक्रिया कहा जाता है जहाँ त्रुटि हुई थी।
सामान्य गैर-पकड़ने योग्य त्रुटियां
गैर-पकड़ने योग्य त्रुटियों के सामान्य उदाहरण हैं:
- त्रुटियों को संकलित करें, जैसे सिंटैक्स त्रुटियां, जो बैच को संकलित करने से रोकती हैं।
- कथन स्तर पुनर्संकलन समस्याएँ जो आमतौर पर आस्थगित नाम समाधान से संबंधित होती हैं. उदाहरण के लिए, आप एक संग्रहीत कार्यविधि बना सकते हैं जो किसी अज्ञात तालिका को संदर्भित करती है। एक त्रुटि केवल तब फेंकी जाती है जब प्रक्रिया तालिका के नाम को ऑब्जेक्टिड में हल करने का प्रयास करती है।
थ्रो का उपयोग करके त्रुटियों को कैसे फिर से फेंकें
यदि THROW स्टेटमेंट का उपयोग CATCH ब्लॉक में बिना किसी पैरामीटर के किया जाता है, तो यह उस त्रुटि को फिर से फेंक देगा जिसके कारण कोड CATCH ब्लॉक में प्रवेश कर गया। आप इस तकनीक का उपयोग त्रुटियों को पकड़कर और उनके विवरण लॉग करके डेटाबेस में त्रुटि लॉगिंग को लागू करने के लिए कर सकते हैं, और फिर मूल त्रुटि को क्लाइंट एप्लिकेशन में फेंक सकते हैं, ताकि इसे वहां संभाला जा सके।
यहां एक त्रुटि को फिर से फेंकने का एक उदाहरण दिया गया है।
BEGIN TRY
-- code to be executed
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE();
THROW
END CATCH
SQL सर्वर के कुछ पुराने संस्करणों में, सिस्टम त्रुटि फेंकने के लिए कोई विधि नहीं थी। जबकि THROW बढ़ाने के लिए सिस्टम त्रुटि निर्दिष्ट नहीं कर सकता है, जब THROW का उपयोग CATCH ब्लॉक में पैरामीटर के बिना किया जाता है, तो यह सिस्टम और उपयोगकर्ता दोनों त्रुटियों को फिर से बढ़ाएगा।
त्रुटि हैंडलिंग फ़ंक्शन क्या हैं
CATCH ब्लॉक त्रुटि से संबंधित जानकारी को CATCH ब्लॉक की पूरी अवधि के दौरान उपलब्ध कराते हैं। इसमें सबस्कोप शामिल हैं, जैसे संग्रहीत कार्यविधियाँ, कैच ब्लॉक के भीतर से चलती हैं।
त्रुटि हैंडलिंग फ़ंक्शन
आपको याद रखना चाहिए कि, @@ERROR के साथ प्रोग्रामिंग करते समय, @@ERROR सिस्टम चर द्वारा रखे गए मान को अगले कथन निष्पादित होते ही रीसेट कर दिया गया था।
टी-एसक्यूएल में संरचित अपवाद हैंडलिंग का एक अन्य महत्वपूर्ण लाभ यह है कि त्रुटि हैंडलिंग कार्यों की एक श्रृंखला प्रदान की गई है और ये कैच ब्लॉक में अपने मूल्यों को बनाए रखते हैं। अलग-अलग फ़ंक्शन एक त्रुटि की प्रत्येक संपत्ति प्रदान करते हैं जिसे उठाया गया है।
इसका मतलब है कि आप जेनेरिक त्रुटि हैंडलिंग संग्रहीत कार्यविधियाँ लिख सकते हैं जो अभी भी त्रुटि से संबंधित जानकारी तक पहुँच सकते हैं।
- CATCH ब्लॉक त्रुटि से संबंधित जानकारी को CATCH ब्लॉक की पूरी अवधि के दौरान उपलब्ध कराते हैं।
- अगला कथन चलाए जाने पर @@Error रीसेट हो जाता है।
कोड में त्रुटियों का प्रबंधन करें
SQL CLR एकीकरण SQL सर्वर के भीतर प्रबंधित कोड के निष्पादन के लिए अनुमति देता है। उच्च-स्तरीय .NET भाषाएँ, जैसे C# और VB, में उनके लिए विस्तृत अपवाद हैंडलिंग उपलब्ध है. त्रुटियों को मानक .NET try/catch/end blocks का उपयोग करके पकड़ा जा सकता है।
प्रबंधित कोड में त्रुटियां
सामान्य तौर पर, आप जितना संभव हो प्रबंधित कोड के भीतर त्रुटियों को पकड़ना चाह सकते हैं। हालांकि, यह महसूस करना महत्वपूर्ण है कि प्रबंधित कोड में हैंडल नहीं की गई किसी भी त्रुटि को कॉलिंग टी-एसक्यूएल कोड पर वापस भेज दिया जाता है। जब भी प्रबंधित कोड में होने वाली कोई त्रुटि SQL सर्वर पर लौटाई जाती है, तो वह 6522 त्रुटि दिखाई देगी. त्रुटियों को नेस्टेड किया जा सकता है और वह विशेष त्रुटि त्रुटि के वास्तविक कारण को लपेट देगी।
प्रबंधित कोड में त्रुटियों का एक और दुर्लभ लेकिन संभावित कारण यह होगा कि कोड SqlCommand ऑब्जेक्ट के माध्यम से RAISERROR T-SQL स्टेटमेंट निष्पादित कर सकता है।