Перехват исключения ArgumentTypeError из настраиваемого действия - PullRequest
9 голосов
/ 27 марта 2012

Как лучше всего создавать исключение ArgumentTypeError из моего собственного настраиваемого действия и разрешать argparse отлавливать его для меня?

Похоже, что блок try / исключением от 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,

Например, в приведенном выше коде. Если бы у меня были дублированные IP-адреса, то исключение упало бы до функции main и напечатало бы некрасивую трассировку стека. Я не хочу этого, и при этом я не хочу помещать блок попытки / кроме внутри main .

1 Ответ

11 голосов
/ 27 марта 2012

После просмотра исходного кода argparse я выяснил, что он переводит ArgumentTypeError в исключение ArgumentError.

Таким образом, вместо:

            raise argparse.ArgumentTypeError("Duplicate OuterIPs found")

у меня должно быть:

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

И argparse все равно сделает для меня все остальное (исключение перехвата и сообщение об использовании печати)...

...