从自定义操作捕获ArgumentTypeError异常

Han*_*olo 9 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)
Run Code Online (Sandbox Code Playgroud)

group.add_argument('-c', "--client", nargs = 2,
            dest = "servers", action = unique_server_endpoints,
Run Code Online (Sandbox Code Playgroud)

例如,在上面的代码中,如果我有重复的IP,则异常将落入函数并打印丑陋的堆栈跟踪.我不希望这样,我也不想在main中放置一个try/except块.

Han*_*olo 11

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

所以代替:

            raise argparse.ArgumentTypeError("Duplicate OuterIPs found")
Run Code Online (Sandbox Code Playgroud)

我应该:

            raise argparse.ArgumentError(self, "Duplicate OuterIPs found")
Run Code Online (Sandbox Code Playgroud)

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