मैं आमतौर पर अपवादों को आंतरिक रूप से संभालना पसंद करता हूं (अर्थात कोशिश की गई फ़ंक्शन के अंदर को छोड़कर, संभवतः कोई नहीं लौटाता) क्योंकि अजगर गतिशील रूप से टाइप किया गया है। सामान्य तौर पर, मैं इसे एक तरह से या दूसरे तरीके से कॉल करने वाला निर्णय मानता हूं, लेकिन गतिशील रूप से टाइप की गई भाषा में, ऐसे छोटे कारक होते हैं जो कॉल करने वाले को अपवाद नहीं पारित करने के पक्ष में तराजू को टिप देते हैं:
- आपके फ़ंक्शन को कॉल करने वाले किसी भी व्यक्ति को उन अपवादों के बारे में सूचित नहीं किया जाता है जिन्हें फेंक दिया जा सकता है। यह जानने के लिए कि आप किस तरह के अपवाद का शिकार हो रहे हैं (और सामान्य से हटकर किए जाने वाले ब्लॉकों को छोड़कर) किस तरह का एक कला रूप हो जाता है।
if val is Noneकी तुलना में थोड़ा आसान है except ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace। सच में, मैं from django.core.exceptions import ObjectDoesNotExistअपने सभी django फ़ाइलों के शीर्ष पर टाइप करने के लिए याद रखने से नफरत करता हूँ बस एक बहुत ही सामान्य उपयोग के मामले को संभालने के लिए। वैधानिक रूप से टाइप की गई दुनिया में, संपादक को इसे आपके लिए करने दें।
ईमानदारी से, हालांकि, यह हमेशा एक निर्णय कॉल है, और जिस स्थिति का आप वर्णन कर रहे हैं, जहां एक फ़ंक्शन को एक त्रुटि प्राप्त होती है जो इसे मदद नहीं कर सकती है, यह एक अपवाद को फिर से बढ़ाने का एक उत्कृष्ट कारण है जो सार्थक है। आपके पास सटीक सही विचार है, लेकिन जब तक आप अपवाद नहीं हैं, तब तक स्टैक ट्रेस में अधिक सार्थक जानकारी प्रदान करने जा रहे हैं
AttributeError: 'NoneType' object has no attribute 'foo'
जो, दस में से नौ बार है, अगर आप किसी को न लौटाने वाले को वापस बुलाते हैं, तो फोन करने वाला आपको परेशान नहीं करेगा।
(यह सब मुझे इस बात की कामना करता है कि अजगर अपवादों में causeडिफ़ॉल्ट रूप से गुण था , जैसे जावा में, जो आपको नए अपवादों में अपवादों को पारित करने देता है ताकि आप अपने इच्छित सभी को फिर से उखाड़ सकें और समस्या के मूल स्रोत को कभी न खो सकें।