I, एक शुरुआती, एक साधारण कार्ड-आधारित जीयूआई पर काम कर रहा हूं, प्रत्येक वर्ग में एक ही एक्सपेक्शन को पकड़ना। पायथन में लिखा है। एक बेस क्लास है कि, अन्य चीजों के साथ, _cards = {'card1_ID': card1, 'card2_ID': card2}
जैसे सभी कार्डों की शब्दावली शामिल है। जीयूआई पर कार्डों को उनके अद्वितीय आईडी द्वारा संदर्भित किया जाता है।कक्षा
जैसा कि मैं अन्य शुरुआती लोगों के लिए कोड को अबाउट बनाने की योजना बना रहा हूं, मैं उन्हें स्पष्ट रूप से सूचित करना चाहता हूं कि अगर वे एक कार्ड आईडी देते हैं जो मौजूद नहीं है (एक KeyError फेंकने के बजाय)। अब मैं बार-बार कोशिश की उम्मीद खंड के एक टन है कि मुझे शक करता है:
बिना कोड, एक पंक्ति के तरीकों का एक हिस्सा कोशिश को पकड़ने:
def shift(self, card_ID, amount):
"""Moves the card by the given amount of pixels.
:param amount: the horizontal and vertical amount of shifting in pixels; tuple"""
try:
self._cards[card_ID].shift(amount)
except KeyError:
raise ValueError("Invaild card ID")
def align(self, card_ID, horizontal, vertical):
"""Aligns the card to the given position."""
try:
card = self._cards[card_ID]
card.align(horizontal, vertical)
except KeyError:
raise ValueError("Invaild card ID")
def invert(self, card_ID):
"""Inverts the card's colour"""
try:
self._cards[card_ID].invert()
except KeyError:
raise ValueError("Invaild card ID")
इस एक स्वीकृत अभ्यास है? कक्षा के हर तरीके में इस KeyError को पकड़ने के लिए कोई बेहतर तरीका है?
एक [सजावट] पर विचार करें (http://thecodeship.com/patterns/guide-to-python-function-decorators/) – khelwood
एक अन्य दृष्टिकोण _cards उदाहरण के ____ getitem \ __ को ओवरराइट करेगा। –
क्या कोई कारण है कि आप अपने कार्ड संग्रह के लिए किसी ऑब्जेक्ट का उपयोग कर रहे हैं जो 'KeyError' उठाता है जब आप चाहते हैं कि 'ValueError' है? या वैकल्पिक रूप से, आप पहली जगह 'ValueError' क्यों चाहते हैं? क्यों न केवल अपने कोड के स्थान पर 'ValueError' की बजाय' KeyError' पकड़ें जो आपकी कक्षा का उपयोग कर रहा है? यदि समस्या कस्टम त्रुटि संदेश है, तो शायद सबसे अच्छी बात यह है कि अपने स्वयं के 'कार्डकोलेक्शन' प्रकार को अपने स्वयं के त्रुटि संदेश के साथ बनाया गया है। –