2012-03-27 22 views
8

से ArgumentTypeError अपवाद को पकड़ने के लिए ArgumentTypeError अपवाद को फेंकने का सबसे अच्छा अभ्यास क्या है और Argparse को मेरे लिए पकड़ने दें?कस्टम कार्रवाई

ऐसा लगता है कि Argparse की कोशिश/ब्लॉक को छोड़कर मेरे कस्टम कार्यों के लिए इस अपवाद को संभाल नहीं है। हालांकि यह अपने अंतर्निहित कार्यों के लिए ठीक है।

class unique_server_endpoints(argparse.Action): 
    """This class avoids having two duplicate OuterIPs in the client argument list""" 
    def __call__(self, parser, namespace, values, option_string=None): 
     ips = set() 
     endpoints = [] 
     for r in values: 
      ep = server_endpoint(r) 
      if ep[0] in ips: 
       raise argparse.ArgumentTypeError("Duplicate OuterIPs found") 
      else: 
       ips.add(ep[0]) 
       endpoints.append(ep) 
     setattr(namespace, self.dest, endpoints) 

और

group.add_argument('-c', "--client", nargs = 2, 
      dest = "servers", action = unique_server_endpoints, 

उदाहरण के लिए, ऊपर मैं नकली आईपी होता तो कोड में तो अपवाद मुख्य कार्य करने के लिए नीचे गिर जाते हैं और बदसूरत स्टैकट्रेस प्रिंट होगा। मुझे वह नहीं चाहिए और न ही मैं मुख्य के अंदर ब्लॉक को छोड़कर/कोशिश नहीं करना चाहता हूं।

उत्तर

9

Argparse स्रोत कोड को देखने के बाद मुझे पता चला कि यह ArgumentTypeError को ArgumentError अपवाद में अनुवाद करता है।

तो बजाय:

  raise argparse.ArgumentTypeError("Duplicate OuterIPs found") 

मैं होना चाहिए:

  raise argparse.ArgumentError(self, "Duplicate OuterIPs found") 

और argparse अभी भी मुझे (पकड़ अपवाद और प्रिंट उपयोग संदेश) के लिए आराम करना होगा ...

+1

क्षमा करें , मुझे * एक * धन्यवाद "टिप्पणी नहीं लिखनी चाहिए, मुझे पता है। लेकिन यह आला सवाल * बिल्कुल * मेरे पास था - और ओपी का जवाब इसे नाखून करता है! :-) – halloleo

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