从自定义操作捕获ArgumentTypeError异常

时间:2012-03-27 00:52:20

标签: python exception argparse

从我自己的自定义操作中抛出ArgumentTypeError异常并让argparse为我捕获它的最佳做法是什么?

似乎argparse的try / except块不能为我的自定义操作处理此异常。虽然它对内置动作也很好。

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 中放置try / except块。

1 个答案:

答案 0 :(得分:11)

在查看argparse源代码后,我发现它将ArgumentTypeError转换为ArgumentError异常。

所以而不是:

            raise argparse.ArgumentTypeError("Duplicate OuterIPs found")

我应该:

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

而argparse仍会为我做其余的事情(捕获异常和打印用法消息)......