चेतावनी! सी + + प्रोग्रामर संभवत: अलग-अलग विचारों के साथ यहां आ रहा है कि कैसे अपवाद-हैंडलिंग को एक सवाल का जवाब देने की कोशिश की जानी चाहिए जो निश्चित रूप से किसी अन्य भाषा के बारे में है!
इस विचार को देखते हुए:
उदाहरण के लिए, कल्पना करें कि हमारे पास संसाधन हैं, जो HTTP अनुरोध करता है और पुनर्प्राप्त डेटा लौटाता है। और ServiceTemporaryUnavailable या RateLimitExceeded जैसी त्रुटियों के बजाय, हम सिर्फ उपभोक्ता को सुझाव देते हुए एक रिट्रीएबल जुटाएंगे कि यह केवल अनुरोध को पुनः प्रयास करें और विशिष्ट विफलता के बारे में परवाह न करें।
... एक बात जो मैं सुझाऊँगा, वह यह हो सकता है कि आप कार्रवाई के पाठ्यक्रमों के साथ एक त्रुटि की रिपोर्ट करने की चिंताओं को इस तरह से जवाब दे सकते हैं जो आपके कोड की व्यापकता को कम कर सकता है या अपवादों के लिए "अनुवाद बिंदुओं" की बहुत आवश्यकता हो सकती है। ।
उदाहरण के लिए, यदि मैं किसी फ़ाइल को लोड करने से संबंधित लेन-देन को मॉडल करता हूं, तो यह कई कारणों से विफल हो सकता है। शायद फ़ाइल लोड करने में एक प्लगइन लोड करना शामिल है जो उपयोगकर्ता की मशीन पर मौजूद नहीं है। शायद फ़ाइल बस भ्रष्ट है और हमें इसे पार्स करने में त्रुटि का सामना करना पड़ा।
कोई फर्क नहीं पड़ता कि क्या होता है, मान लें कि कार्रवाई का कोर्स उपयोगकर्ता को क्या हुआ है और उसे इसके बारे में क्या करना है, उसके बारे में उसे सूचित करना है ("पुनः प्रयास करें, किसी अन्य फ़ाइल को लोड करें, रद्द करें")।
फेंकने वाला बनाम पकड़ने वाला
कार्रवाई का यह पाठ्यक्रम इस बात पर ध्यान दिए बिना लागू होता है कि इस मामले में हमें किस तरह की त्रुटि हुई। यह एक पार्सिंग त्रुटि के सामान्य विचार में एम्बेडेड नहीं है, यह एक प्लगइन लोड करने में विफल होने के सामान्य विचार में एम्बेडेड नहीं है। यह फ़ाइल लोड करने के सटीक संदर्भ (फ़ाइल लोड करने का संयोजन और विफल होना) के दौरान ऐसी त्रुटियों का सामना करने के विचार में अंतर्निहित है। इसलिए आमतौर पर मैं इसे गंभीर रूप से बोलता हूं, catcher's
एक फेंके गए अपवाद के जवाब में कार्रवाई के पाठ्यक्रम को निर्धारित करने की जिम्मेदारी के रूप में (उदा: उपयोगकर्ता को विकल्पों के साथ संकेत देना), नहीं thrower's
।
एक और तरीका रखो, जिन साइटों throw
पर अपवाद होते हैं, उनमें आमतौर पर इस तरह की प्रासंगिक जानकारी का अभाव होता है, खासकर अगर फेंकने वाले कार्य आम तौर पर लागू होते हैं। यहां तक कि जब वे यह जानकारी रखते हैं, तो पूरी तरह से विकृत संदर्भ में, आप इसे throw
साइट में एम्बेड करके पुनर्प्राप्ति व्यवहार के मामले में अपने आप को समाप्त कर लेते हैं । वे साइटें जो catch
आमतौर पर कार्रवाई का एक कोर्स निर्धारित करने के लिए सबसे अधिक जानकारी उपलब्ध हैं, और यदि आप उस दिए गए लेन-देन के लिए कार्रवाई का पाठ्यक्रम बदलना चाहिए, तो आपको संशोधित करने के लिए एक केंद्रीय स्थान प्रदान करना होगा।
जब आप अपवादों को फेंकने की कोशिश नहीं करना शुरू करते हैं, तो रिपोर्ट करना गलत नहीं है लेकिन यह निर्धारित करने की कोशिश करना कि क्या करना है, जो आपके कोड की व्यापकता और लचीलेपन को नीचा दिखा सकता है। एक पार्सिंग त्रुटि हमेशा इस तरह के संकेत के लिए नहीं होनी चाहिए, यह उस संदर्भ से भिन्न होती है जिसमें इस तरह के अपवाद को फेंक दिया जाता है (लेनदेन जिसके तहत इसे फेंक दिया गया था)।
द ब्लाइंड थ्रोअर
बस सामान्य तौर पर, अपवाद-हैंडलिंग का एक बहुत डिजाइन अक्सर एक अंधे फेंकने वाले के विचार के आसपास घूमता है। यह नहीं पता है कि अपवाद कैसे पकड़ा जा सकता है, या कहाँ है। मैनुअल त्रुटि प्रसार के उपयोग से त्रुटि पुनर्प्राप्ति के पुराने रूपों के लिए भी यही लागू होता है। वे साइटें जो त्रुटियों का सामना करती हैं, उनमें उपयोगकर्ता कार्रवाई का कोर्स शामिल नहीं है, वे केवल न्यूनतम जानकारी को रिपोर्ट करने के लिए एम्बेड करते हैं कि किस तरह की त्रुटि आई थी।
उल्टे जिम्मेदारियों और पकड़ने वाले को सामान्य बनाना
इस बारे में और ध्यान से सोचने पर, मैं उस तरह के कोडबेस की कल्पना करने की कोशिश कर रहा था जहाँ यह एक प्रलोभन बन सकता है। मेरी कल्पना (संभवतः गलत है) यह है कि आपकी टीम अभी भी "उपभोक्ता" की भूमिका निभा रही है और अधिकांश कॉलिंग कोड भी लागू कर रही है। शायद आपके पास बहुत सारे असमान लेनदेन (बहुत सारे try
ब्लॉक) हैं जो सभी त्रुटियों के एक ही सेट में चल सकते हैं, और सभी को एक डिजाइन परिप्रेक्ष्य से, पुनर्प्राप्ति कार्रवाई के एक समान पाठ्यक्रम का नेतृत्व करना चाहिए।
Lightness Races in Orbit's
ठीक जवाब से बुद्धिमान सलाह को ध्यान में रखते हुए (जो मुझे लगता है कि वास्तव में एक उन्नत पुस्तकालय उन्मुख मानसिकता से आ रहा है), आपको अभी भी "क्या करें" अपवादों को फेंकने के लिए लुभाया जा सकता है, केवल लेनदेन वसूली साइट के करीब।
यहां से एक मध्यस्थ, सामान्य लेनदेन से निपटने वाली साइट को ढूंढना संभव हो सकता है जो वास्तव में "क्या करना है" चिंताओं को केंद्रीकृत करता है लेकिन अभी भी पकड़ने के संदर्भ में है।
यह केवल तभी लागू होगा जब आप किसी प्रकार के सामान्य फ़ंक्शन को डिज़ाइन कर सकते हैं, जो इन सभी बाहरी लेनदेन का उपयोग करते हैं (उदा: एक फ़ंक्शन जो कॉल करने के लिए एक अन्य फ़ंक्शन इनपुट करता है या एक सार लेन-देन का आधार वर्ग है, जो अति-व्यवहार योग्य व्यवहार के साथ इस मध्यस्थ लेनदेन साइट को परिष्कृत करता है जो परिष्कृत कैचिंग करता है। )।
फिर भी एक व्यक्ति विभिन्न संभावित त्रुटियों के जवाब में कार्रवाई के उपयोगकर्ता पाठ्यक्रम को केंद्रीयकृत करने के लिए जिम्मेदार हो सकता है, और अभी भी फेंकने के बजाय पकड़ने के संदर्भ में है। सरल उदाहरण (पायथन-इश स्यूडोकोड, और मैं मामूली रूप से एक अनुभवी पायथन डेवलपर नहीं हूं, इसलिए इस बारे में और अधिक मुहावरेदार तरीका हो सकता है):
def general_catcher(task):
try:
task()
except SomeError1:
# do some uniformly-designed recovery stuff here
except SomeError2:
# do some other uniformly-designed recovery stuff here
...
[उम्मीद से बेहतर नाम के साथ general_catcher
]। इस उदाहरण में, आप एक फ़ंक्शन में पास कर सकते हैं कि किस कार्य को करना है लेकिन फिर भी सभी प्रकार के अपवादों के लिए सामान्यीकृत / एकीकृत कैच व्यवहार से लाभ प्राप्त करें, जिसमें आप रुचि रखते हैं और "क्या करें" भाग को विस्तारित या संशोधित करना जारी रखें आप इस केंद्रीय स्थान से पसंद करते हैं और अभी भी एक catch
संदर्भ के भीतर जहां यह आमतौर पर प्रोत्साहित किया जाता है। सबसे अच्छी बात यह है कि हम फेंकने वाली साइटों को अपने आप से "क्या करें" ("अंधा फेंक" की धारणा को संरक्षित करते हुए) रख सकते हैं।
यदि आपको इन सुझावों में से कोई भी यहां सहायक नहीं लगता है और वैसे भी "क्या करें" अपवादों को फेंकने का एक मजबूत प्रलोभन है, मुख्य रूप से इस बात से अवगत रहें कि यह बहुत कम से कम बहुत ही विरोधी मुहावरेदार है, साथ ही साथ एक सामान्यीकृत मानसिकता को भी हतोत्साहित करता है।