Erlang 21 - 4. Error handling

4 त्रुटि से निपटने




erlang

4 त्रुटि से निपटने

4.1 रणनीति

Erlang ODBC API का उपयोग करके एक डेटाबेस कनेक्शन शुरू करने वाला एक वैचारिक स्तर पर एक बुनियादी क्लाइंट सर्वर एप्लिकेशन है। क्लाइंट प्रक्रिया कनेक्शन को प्रबंधित करने वाली सर्वर प्रक्रिया के साथ शुरू करने और संचार करने के लिए एपीआई का उपयोग करती है। एरलैंग ओडीबीसी एप्लिकेशन की रणनीति यह है कि एप्लिकेशन में प्रोग्रामिंग दोष स्वयं असामान्य रूप से समाप्त करने के लिए कनेक्शन प्रक्रिया का कारण बनेंगे। (जब एक प्रक्रिया असामान्य रूप से समाप्त हो जाएगी तो इसका पर्यवेक्षक प्रासंगिक त्रुटि रिपोर्ट लॉग करेगा।) कनेक्शन समाप्त होने के दौरान या बाद में एपीआई कार्यों को कॉल करता है। प्रक्रिया, {error, connection_closed} वापस आ जाएगी। दूसरी ओर प्रासंगिक त्रुटियां उस कनेक्शन को समाप्त नहीं करेंगी जो ग्राहक को केवल {error, Reason} लौटाएगा, जहां Reason किसी भी प्रकार का हो सकता है।

ग्राहकों

कनेक्शन उस प्रक्रिया से जुड़ा है जिसने इसे बनाया है और केवल इसके माध्यम से पहुँचा जा सकता है। इसका कारण परिणाम सेट और लेनदेन के शब्दार्थ को संरक्षित करना है जब select_count / [2,3] को कॉल किया जाता है या auto_commit बंद कर दिया जाता है। किसी अन्य प्रक्रिया से कनेक्शन का उपयोग करने का प्रयास विफल हो जाएगा। इससे कनेक्शन प्रभावित नहीं होगा। दूसरी ओर, अगर क्लाइंट प्रक्रिया मर जाती है तो कनेक्शन समाप्त हो जाएगा।

समय समाप्ति

क्लाइंट द्वारा कनेक्शन के लिए किए गए सभी अनुरोध सिंक्रोनस हैं। यदि टाइमआउट का उपयोग किया जाता है और समय सीमा समाप्त होने के साथ क्लाइंट प्रक्रिया समाप्त हो जाएगी। संभवतया सही बात यह है कि ग्राहक को मरने दिया जाए और शायद उसके पर्यवेक्षक द्वारा पुनः आरंभ किया जाए। लेकिन अगर ग्राहक इस समय को पकड़ने का विकल्प चुनता है, तो फिर से प्रयास करने से पहले थोड़ी प्रतीक्षा करना एक अच्छा विचार है। यदि कनेक्शन को पकड़े जाने वाले कई लगातार टाइमआउट हैं, तो यह निष्कर्ष निकलेगा कि कुछ गलत है और कनेक्शन समाप्त हो गया है।

gaurds

सभी API- फ़ंक्शंस संरक्षित हैं और यदि आप गलत प्रकार का तर्क पास करते हैं, तो रनटाइम त्रुटि होगी। आंतरिक कार्यों के लिए सभी इनपुट मापदंडों को सही माना जाता है। यह वास्तव में बाहरी स्रोतों से केवल अविश्वास इनपुट के लिए एक अच्छा प्रोग्रामिंग अभ्यास है। आप इन त्रुटियों को पकड़ने वाले नहीं हैं, यह केवल कोड को बहुत गन्दा और बहुत अधिक जटिल बना देगा, जो अधिक बग का परिचय देता है और सबसे खराब स्थिति में वास्तविक दोष को भी कवर करता है। इसके बजाय परीक्षण पर अपना प्रयास करें, आपको अपने स्वयं के इनपुट पर भरोसा करना चाहिए।

४.२ पूरी तस्वीर

जैसा कि एरलांग ODBC एप्लिकेशन थर्ड पार्टी उत्पादों पर निर्भर करता है और एक डेटाबेस के साथ संचार करता है जो संभवतः नेटवर्क के किसी अन्य कंप्यूटर पर चलता है जिसमें बहुत सारी चीजें हैं जो गलत हो सकती हैं। जो चीजें हो सकती हैं उन्हें पूरी तरह से समझने के लिए एर्लांग ओडीबीसी एप्लिकेशन के डिजाइन को जानने की सुविधा है, इसलिए यहां वर्तमान डिजाइन का संक्षिप्त विवरण निम्नानुसार है।

ध्यान दें

कृपया ध्यान दें कि डिजाइन कुछ है, जो जरूरी नहीं है, लेकिन भविष्य के रिलीज में बदल सकता है। जबकि एपीआई का शब्दार्थ परिवर्तन नहीं होगा क्योंकि यह कार्यान्वयन से स्वतंत्र है।

चित्र 4.1: एरलांग ओडबेक एप्लिकेशन का आर्किटेक्चर

जब आप आवेदन करते हैं: शुरू (ओडीबीसी) केवल एक चीज होती है जो कि पर्यवेक्षक प्रक्रिया शुरू होती है। एपीआई फ़ंक्शन कनेक्ट / 2 के लिए प्रत्येक कॉल के लिए एक प्रक्रिया शुरू की जाती है और एक बच्चे के रूप में एर्लांग ओडीबीसी पर्यवेक्षक में जोड़ा जाता है। पर्यवेक्षकों को केवल कार्य त्रुटि-लॉग रिपोर्ट प्रदान करना है, अगर एक बच्चे की प्रक्रिया असामान्य रूप से मरनी चाहिए, और एक कोड परिवर्तन करने की संभावना है। केवल क्लाइंट प्रक्रिया के पास यह तय करने के लिए ज्ञान है कि क्या इस कनेक्शन प्रबंधन प्रक्रिया को फिर से शुरू किया जाना चाहिए।

कनेक्ट / 2 के द्वारा उत्पन्न erlang कनेक्शन प्रक्रिया, एक सी-प्रक्रिया के लिए एक पोर्ट खोलेगी जो Microsoft के ODBC API के माध्यम से डेटाबेस के साथ संचार को संभालती है। एग्जिट सिग्नल के प्रसार के लिए एर्गलैंग पोर्ट को खुला रखा जाएगा, अगर सी-प्रोसेस में कुछ गलत हो जाता है और यह बाहर निकलता है तो हम चाहते हैं कि कारण के बारे में जितना संभव हो उतना संभव हो। सी-प्रक्रिया के साथ मुख्य संचार सॉकेट्स के माध्यम से किया जाता है। सी-प्रोसेस में दो धागे, सुपरवाइजर थ्रेड और डेटाबेस हैंडलर थ्रेड होते हैं। सुपरवाइजर धागा सुपरवाइजर सॉकेट पर शटडाउन संदेशों के लिए जाँच करता है और डेटाबेस हैंडलर धागा अनुरोधों को प्राप्त करता है और डेटाबेस सॉकेट पर उत्तर भेजता है। यदि डेटाबेस थ्रेड कुछ डेटाबेस कॉल पर लटका हुआ लगता है, तो इरलांग नियंत्रण प्रक्रिया पर्यवेक्षक सॉकेट पर एक शटडाउन संदेश भेज देगी, इस मामले में सी-प्रक्रिया बाहर निकल जाएगी। यदि सी-प्रोसेस क्रैश / एग्जिट करता है तो यह एरलैंग-प्रोसेस को भी नीचे लाएगा और इसके विपरीत यानी कनेक्शन समाप्त हो गया है।

त्रुटि प्रकार

त्रुटियों के प्रकार निम्न श्रेणियों में विभाजित हो सकते हैं।

  • कॉन्फ़िगरेशन समस्याएँ - उस डेटाबेस से सब कुछ सही सेट अप नहीं किया गया था कि एर-पोर्ट के माध्यम से चलाया जाने वाला सी-प्रोग्राम आपके प्लेटफ़ॉर्म के लिए संकलित नहीं किया गया था।
  • ODBC ड्राइवर द्वारा खोजे गए त्रुटियां - यदि ODL- ड्राइवर को कॉल उन परिस्थितियों के कारण विफल हो जाती है जिन्हें Erlang ODBC एप्लिकेशन प्रोग्रामर द्वारा नियंत्रित नहीं किया जा सकता है, तो ड्राइवर से एक त्रुटि स्ट्रिंग खोदी जाएगी। यह स्ट्रिंग {error, Reason} रिटर्न वैल्यू में {error, Reason} । यह त्रुटि संदेश कितना अच्छा होगा यह निश्चित रूप से ड्राइवर पर निर्भर करेगा। ऐसी परिस्थितियों के उदाहरण एक ही कुंजी को दो बार अमान्य SQL- क्वेरीज़ में सम्मिलित करने का प्रयास कर रहे हैं और डेटाबेस बंद हो गया है।
  • कनेक्शन समाप्ति - यदि किसी कनेक्शन को असामान्य तरीके से समाप्त किया जाता है, या यदि आप एक कनेक्शन का उपयोग करने का प्रयास करते हैं, जिसे आपने पहले से ही डिस्कनेक्ट / 1 पर कॉल करके सामान्य तरीके से समाप्त कर दिया है, तो रिटर्न मान {error, connection_closed} । Erlang ODBC अनुप्रयोग में प्रोग्रामिंग त्रुटि के कारण कनेक्शन असामान्य रूप से समाप्त हो सकता है, लेकिन अगर ODBC ड्राइवर क्रैश हो जाता है।
  • प्रासंगिक त्रुटियां - अगर एपीआई फ़ंक्शन का उपयोग गलत संदर्भ में किया जाता है, तो त्रुटि ट्यूपल में Reason एक वर्णनात्मक परमाणु होगा। उदाहरण के लिए, यदि आप कनेक्शन के साथ सेट किए गए परिणाम को संबद्ध करने के लिए पहले कॉल करने के लिए select_count/[2,3] बिना last/[1,2] फ़ंक्शन को कॉल करने का प्रयास करते हैं। यदि ODBC- ड्राइवर कुछ फ़ंक्शंस का समर्थन नहीं करता है, या यदि आपने किसी कनेक्शन के लिए कुछ कार्यक्षमता अक्षम की है और तब इसका उपयोग करने का प्रयास करें।