2013-03-11 11 views
11

के भीतर से अपवाद दोबारा असाइन करें एक कस्टम कर्सर वर्ग में __exit__ ब्लॉक के भीतर से मैं अपवाद पकड़ना चाहता हूं ताकि मैं एक और विशिष्ट अपवाद फेंक सकूं। ऐसा करने का सही तरीका क्या है?एक अजगर __exit__ ब्लॉक

class Cursor: 
    def __enter__(self): 
     ... 

    def __exit__(self, ex_type, ex_val, tb): 
     if ex_type == VagueThirdPartyError: 
      # get new more specific error based on error code in ex_val and 
      # return that one in its place. 
      return False # ? 
     else: 
      return False 

__exit__ ब्लॉक के भीतर विशिष्ट अपवाद स्थापना एक हैक की तरह लगता है, लेकिन शायद मैं इसे सोच से अधिक रहा हूँ।

+0

यह अपवाद को बढ़ाने के लिए हैक की तरह क्यों लगता है? – NPE

+1

मैंने सोचा कि ऐसा करने का दूसरा तरीका हो सकता है क्योंकि संदर्भ प्रबंधक मुख्य ब्लॉक के भीतर किसी भी अपवाद को पकड़ता है, इसे संग्रहीत करता है, और उसके बाद उसे स्वीकृति देने या veto करने के लिए __exit__ तक भेजता है। __exit__ के भीतर बढ़ना प्रतीत होता है कि यह इसके तर्कों के आधार पर अपनी जिम्मेदारियों का विस्तार होगा - लेकिन मैं इसे सोचने पर स्पष्ट रूप से था। – jpredham

उत्तर

16

उचित प्रक्रिया __exit__ हैंडलर के अंदर नया अपवाद बढ़ाने के लिए है।

आपको हालांकि अपवाद को उठाया जाना चाहिए; संदर्भ प्रबंधक चेनिंग के लिए अनुमति देने के लिए, उस स्थिति में आपको केवल हैंडलर से झूठा मूल्य वापस करना चाहिए। अपने स्वयं के अपवादों को बढ़ाने हालांकि पूरी तरह से ठीक है।

ध्यान दें कि इसे पारित-इन अपवाद के प्रकार सत्यापित करने के लिए पहचान परीक्षण is उपयोग करने के लिए बेहतर है:

def __exit__(self, ex_type, ex_val, tb): 
    if ex_type is VagueThirdPartyError: 
     if ex_val.args[0] == 'foobar': 
      raise SpecificException('Foobarred!') 

     # Not raising a new exception, but surpressing the current one: 
     if ex_val.args[0] == 'eggs-and-ham': 
      # ignore this exception 
      return True 

     if ex_val.args[0] == 'baz': 
      # re-raise this exception 
      return False 

    # No else required, the function exits and `None` is returned 

तुम भी issubclass(ex_type, VagueThirdPartyError) का उपयोग विशिष्ट अपवाद के उपवर्गों के लिए अनुमति देने के लिए कर सकता है।

+4

या संभवतः: 'अगर जारीकर्ता (ex_type, VagueThirdPartyError) ' – mgilson

+1

** tl; डॉ ** Googlers के लिए: कस्टम' __exit__' अपवादों का प्रचार नहीं कर रहा है? कुछ भी वापस न करें/झूठा मूल्य वापस न करें। – Qix

संबंधित मुद्दे