2012-03-27 2 views
8

Qual è la procedura migliore per generare un'eccezione ArgumentTypeError dalla mia azione personalizzata e lasciare che argparse lo prenda per me?Catching ArgumentTypeError exception from custom action

Sembra che il blocco try/except di argparse non gestisca questa eccezione per le mie azioni personalizzate. Anche se lo fa bene per le sue azioni integrate.

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) 

e

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

Ad esempio, nel codice di cui sopra Se avrei IP duplicati quindi l'eccezione sarebbe caduta giù per la principale funzione di e stampare il brutto stacktrace. Non lo voglio e nemmeno io non voglio provare, tranne il blocco all'interno di principale.

risposta

9

Dopo aver esaminato il codice sorgente argparse ho capito che traduce ArgumentTypeError in eccezione ArgumentError.

Così, invece di:

  raise argparse.ArgumentTypeError("Duplicate OuterIPs found") 

dovrei avere:

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

E argparse vorrei ancora fare il resto per me (eccezione cattura e stampare messaggio di utilizzo) ...

+1

Spiacente , Dovrei * non * scrivere solo un commento "Grazie", lo so. Ma questa domanda di nicchia era * esattamente * quella che avevo - e la risposta dell'OP lo inchioda! :-) – halloleo