我希望Python argparse抛出异常而不是用法提示

49 投票
2 回答
23572 浏览
提问于 2025-04-17 14:57

我觉得这可能不太行,但我想自己处理argparse中的异常。

比如说:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', help='foo help', required=True)
try:
    args = parser.parse_args()
except:
    do_something()

当我运行这个代码的时候:

$ myapp.py
usage: myapp --foo foo
myapp: error: argument --foo is required

但我希望它能进入异常处理的部分。

2 个回答

27

在我的情况下,argparse会打印“参数太少”然后退出。看了argparse的代码后,我发现它在打印一些信息后只是简单地调用了sys.exit()。其实,sys.exit()只是抛出一个SystemExit异常,所以你可以捕获这个异常。

所以试试这个方法,看看对你是否有效。

    try:
        args = parser.parse_args(args)
    except SystemExit:
        .... your handler here ...
        return
82

你可以创建一个新的类,继承自 ArgumentParser,并重写它的 error 方法,这样在出现错误时就可以做一些不同的处理:

class ArgumentParserError(Exception): pass

class ThrowingArgumentParser(argparse.ArgumentParser):
    def error(self, message):
        raise ArgumentParserError(message)

parser = ThrowingArgumentParser()
parser.add_argument(...)
...

撰写回答