从我自己的自定义操作中抛出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块。
答案 0 :(得分:11)
在查看argparse源代码后,我发现它将ArgumentTypeError转换为ArgumentError异常。
所以而不是:
raise argparse.ArgumentTypeError("Duplicate OuterIPs found")
我应该:
raise argparse.ArgumentError(self, "Duplicate OuterIPs found")
而argparse仍会为我做其余的事情(捕获异常和打印用法消息)......