क्या अपवादों को उठाने के लिए इसे बुरा माना जाता है __init__
? यदि ऐसा है, तो एक निश्चित श्रेणी चर के रूप में None
या एक गलत प्रकार के रूप में आरंभ होने पर त्रुटि को फेंकने की स्वीकृत विधि क्या है ?
क्या अपवादों को उठाने के लिए इसे बुरा माना जाता है __init__
? यदि ऐसा है, तो एक निश्चित श्रेणी चर के रूप में None
या एक गलत प्रकार के रूप में आरंभ होने पर त्रुटि को फेंकने की स्वीकृत विधि क्या है ?
जवाबों:
भीतर अपवाद उठाना __init__()
बिल्कुल ठीक है। एक निर्माता के भीतर एक त्रुटि स्थिति को इंगित करने का कोई अन्य अच्छा तरीका नहीं है, और मानक पुस्तकालय में कई सैकड़ों उदाहरण हैं जहां एक वस्तु का निर्माण एक अपवाद उठा सकता है।
त्रुटि वर्ग, निश्चित रूप से, आपके ऊपर है। ValueError
सबसे अच्छा है अगर कंस्ट्रक्टर को एक अमान्य पैरामीटर पारित किया गया था।
ValueError
और TypeError
।
__init__
कंस्ट्रक्टर नहीं है, इसके इंतिहाईज़र हैं। आप लाइन को संपादित करना चाह सकते हैं । एक कंस्ट्रक्टर के भीतर त्रुटि की स्थिति को इंगित करने का कोई और अच्छा तरीका नहीं है,
यह सच है कि एक निर्माता में एक त्रुटि को इंगित करने का एकमात्र उचित तरीका एक अपवाद उठा रहा है। यही कारण है कि C ++ में और अन्य ऑब्जेक्ट-ओरिएंटेड भाषाओं में जिन्हें अपवाद सुरक्षा को ध्यान में रखते हुए डिज़ाइन किया गया है, विध्वंसक को नहीं कहा जाता है यदि किसी ऑब्जेक्ट के कंस्ट्रक्टर में अपवाद को फेंक दिया जाता है (जिसका अर्थ है कि ऑब्जेक्ट का प्रारंभ अधूरा है)। अक्सर यह स्क्रिप्टिंग भाषाओं में ऐसा नहीं होता है, जैसे कि पायथन। उदाहरण के लिए, निम्न कोड एक गुण फेंकता है यदि सॉकेट। कनेक्ट () विफल रहता है:
class NetworkInterface:
def __init__(self, address)
self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.socket.connect(address)
self.stream = self.socket.makefile()
def __del__(self)
self.stream.close()
self.socket.close()
कारण यह है कि कनेक्शन की कोशिश विफल होने के बाद अधूरी वस्तु के विनाशकर्ता को बुलाया जाता है, इससे पहले कि धारा विशेषता को आरंभीकृत किया गया हो। आपको रचनाकारों से अपवादों को फेंकने से बचना चाहिए, मैं सिर्फ इतना कह रहा हूं कि पायथन में पूरी तरह से अपवाद सुरक्षित कोड लिखना मुश्किल है। कुछ पायथन डेवलपर्स विनाशकारियों का उपयोग करने से पूरी तरह से बचते हैं, लेकिन यह एक और बहस का विषय है।
__del__
क्योंकि यह बुरी तरह से लिखा गया है। यदि आप this->p_socket->close()
C ++ में एक विध्वंसक में करते हैं तो आपको बिल्कुल वही समस्या होगी । C ++ में, आप ऐसा नहीं करेंगे - आप सदस्य ऑब्जेक्ट को स्वयं नष्ट कर देंगे। अजगर में भी ऐसा ही करें।
मुझे ऐसा कोई कारण नहीं दिख रहा है कि यह खराब हो।
इसके विपरीत, चीजों में से एक अपवाद को अच्छी तरह से करने के लिए जाना जाता है, जैसा कि त्रुटि कोड के विरोध में है, यह है कि त्रुटि कोड आमतौर पर निर्माणकर्ताओं द्वारा वापस नहीं किए जा सकते हैं । इसलिए सी ++ जैसी भाषाओं में कम से कम, अपवादों को उठाना त्रुटियों को इंगित करने का एकमात्र तरीका है।
मैं उपरोक्त सभी के साथ सहमत हूं।
वास्तव में यह संकेत देने का कोई अन्य तरीका नहीं है कि एक अपवाद को बढ़ाने के अलावा किसी वस्तु के प्रारंभिककरण में कुछ गलत हुआ।
अधिकांश कार्यक्रमों की कक्षाओं में जहां एक वर्ग की स्थिति पूरी तरह से उस वर्ग के इनपुट पर निर्भर होती है, हम उम्मीद कर सकते हैं कि किसी प्रकार के ValueError या TypeError को उठाया जा सकता है।
साइड-इफेक्ट्स वाली कक्षाएं (जैसे कि जो नेटवर्किंग या ग्राफिक्स करता है) एक त्रुटि को बढ़ा सकती है यदि (उदाहरण के लिए) नेटवर्क डिवाइस अनुपलब्ध है या कैनवास ऑब्जेक्ट को नहीं लिखा जा सकता है। यह मुझे समझदार लगता है क्योंकि अक्सर आप जल्द से जल्द विफलता की स्थितियों के बारे में जानना चाहते हैं।