मैं एक मॉड्यूल लिख रहा हूं और अपवादों के लिए एक एकीकृत अपवाद पदानुक्रम रखना चाहता हूं जो इसे बढ़ा सकता है (जैसे FooError
सभी foo
मॉड्यूल के विशिष्ट अपवादों के लिए एक सार वर्ग से विरासत में मिला )। इससे मॉड्यूल के उपयोगकर्ता उन विशेष अपवादों को पकड़ सकते हैं और यदि आवश्यक हो, तो उन्हें विशिष्ट रूप से संभाल सकते हैं। लेकिन मॉड्यूल से उठाए गए कई अपवाद कुछ अन्य अपवाद के कारण उठाए गए हैं; उदाहरण के लिए एक फ़ाइल पर OSError के कारण कुछ कार्य में विफल।
मुझे इसकी आवश्यकता है "अपवाद" को लपेटने के लिए, जैसे कि इसका एक अलग प्रकार और संदेश है , ताकि जो भी अपवाद को पकड़ता है, उसके द्वारा प्रचार प्रसार पदानुक्रम तक जानकारी उपलब्ध हो। लेकिन मैं मौजूदा प्रकार, संदेश और स्टैक ट्रेस खोना नहीं चाहता; समस्या को डीबग करने का प्रयास करने वाले व्यक्ति के लिए यह सभी उपयोगी जानकारी है। एक शीर्ष-स्तरीय अपवाद हैंडलर कोई अच्छा नहीं है, क्योंकि मैं अपवाद को सजाने से पहले यह कोशिश कर रहा हूं कि इससे प्रचार ढेर हो जाए, और शीर्ष-स्तरीय हैंडलर बहुत देर हो जाए।
यह आंशिक रूप से मेरे मॉड्यूल foo
के विशिष्ट अपवाद प्रकारों को मौजूदा प्रकार (जैसे class FooPermissionError(OSError, FooError)
) से प्राप्त करके हल किया जाता है , लेकिन इससे मौजूदा अपवाद उदाहरण को नए प्रकार में लपेटना आसान नहीं होता है, और न ही संदेश को संशोधित किया जा सकता है।
पायथन के PEP 3134 "अपवाद चेनिंग और एंबेडेड ट्रैसबैक्स" अपवाद वस्तुओं को "चेनिंग" करने के लिए पायथन 3.0 में स्वीकार किए गए बदलाव की चर्चा करते हैं, यह इंगित करने के लिए कि मौजूदा अपवाद की हैंडलिंग के दौरान एक नया अपवाद उठाया गया था।
मैं जो करने की कोशिश कर रहा हूं वह संबंधित है: मुझे इसके पहले पायथन संस्करणों में भी काम करने की आवश्यकता है, और मुझे इसकी आवश्यकता है कि मैं इसे जंजीरों के लिए नहीं, बल्कि केवल बहुरूपता के लिए उपयोग करूं। ऐसा करने का सही तरीका क्या है?
except Exception as e
-> raise type(e), type(e)(e.message + custom_message), sys.exc_info()[2]
-> यह समाधान एक अन्य SO प्रश्न से है । यह सुंदर लेकिन कार्यात्मक नहीं है।