2012-03-27 10 views
8

¿Cuál es la mejor práctica para lanzar una excepción ArgumentTypeError de mi propia acción personalizada y dejar que el argparse la atrape?Captura de excepción de ArgumentTypeError de la acción personalizada

Parece que el bloque try/except de argparse no maneja esta excepción para mis acciones personalizadas. Aunque funciona bien para sus acciones integradas.

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) 

y

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

Por ejemplo, en el código anterior Si tuviera IP duplicadas a continuación la excepción caería hasta el función principal e imprimir el StackTrace feo. No quiero eso y tampoco quiero poner un bloque try/except dentro del principal.

Respuesta

9

Después de mirar el código fuente argparse me di cuenta de que traduce ArgumentTypeError a la excepción ArgumentError.

Así que en lugar de:

  raise argparse.ArgumentTypeError("Duplicate OuterIPs found") 

que debería tener:

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

Y argparse todavía haría el resto para mí (a excepción de captura y modo de uso de impresión) ...

+1

este momento , Debería * no * escribir solo un comentario de "Gracias", lo sé. Pero esta pregunta de nicho fue * exactamente * la que tuve - ¡y la respuesta del OP la clava! :-) – halloleo

Cuestiones relacionadas