为什么带subparsers的argparse设置exit_on_error=False后无法捕获异常?
问题原因
这个问题的核心是子解析器默认不会继承父解析器的exit_on_error属性:
- 场景1中你只使用了根解析器,显式设置了
exit_on_error=False,参数解析出错时不会直接打印默认错误并退出,而是向上抛出argparse.ArgumentError异常,最终被你外层的try...except捕获,触发自定义logger输出。 - 场景2新增子解析器时,调用
subparsers.add_parser()生成的子解析器默认使用exit_on_error=True的配置,不会继承根解析器的参数。当子解析器校验参数出错时,会直接执行内部的退出逻辑,打印argparse默认错误信息后终止程序,异常不会抛到你写的外层捕获逻辑中,因此自定义logger不会被触发。
解决方法
创建子解析器时,手动传入exit_on_error参数继承根解析器的配置即可:
def argg(): parser = argparse.ArgumentParser(prog='ProgramName', description="A program that does mircales when it runs. LOL!", exit_on_error=False) subparsers = parser.add_subparsers(dest='mode') # 创建子解析器时手动传exit_on_error参数 subparser1 = subparsers.add_parser('regular', help="run program in regular mode", exit_on_error=parser.exit_on_error) subparser1.add_argument('-int', '--integers', type=int, required=True) return parser.parse_args()
修改后子解析器校验出错时也会向上抛出异常,就能被外层捕获并触发自定义logger输出了。
补充说明:
exit_on_error是Python 3.9版本新增的参数,如果你使用的是更早的Python版本,需要重写解析器的error方法来实现自定义错误处理。
内容的提问来源于stack exchange,提问作者Newbie92
相关产品推荐
相关产品推荐

