以下代码应采用带参数的参数。如果参数没有提供给参数,则应该捕获块中的错误except,但这不会发生。在这种情况下,该块正在finally工作。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-a', type=int)
try:
args = parser.parse_args(['-a']) #Здесь ожидается аргумент, но мы его намеренно не передали
print(args)
except Exception as e:
print('Exception: %s'%(e))
finally:
print('Finally section works')
print('End of code')
执行输出代码时,我们看到该块except不起作用:
usage: t.py [-h] [-a A]
t.py: error: argument -a: expected one argument
Finally section works
为什么会这样?
让我们看看您的代码输出什么,除其他外(至少在 Google Colab 中):
是的,这意味着它
argparse不是抛出一个普通的异常,而是SystemExit一个不是从 Exception 继承的异常。如果您指定我们要捕获的内容,则可以捕获此异常:SystemExitBaseException也就是说,这就是如何捕获异常并且程序将最终确定的方式:
也是如此:
正如我提供的链接中所述,它是故意这样做的,以免意外捕获
SystemExit典型程序块的异常except Exception as e:,毕竟这是一个特殊异常,您需要有意识地捕获它。