Python中的try-finally子句表现异常

时间:2019-01-28 11:55:14

标签: python exception exception-handling try-catch default

我对try / except / finally在Python中的工作方式的理解可能有所失误,但我希望以下内容能按注释中所述工作。

from sys import argv

try:
    x = argv[1]  # Set x to the first argument if one is passed
finally:
    x = 'default'  # If no argument is passed (throwing an exception above) set x to 'default'

print(x)

我希望上面的文件(foo.py)以default运行时应打印python .\foo.py,如果以bar运行则应打印python .\foo.py bar

bar功能按预期工作,但是default行为无效;如果我运行python .\foo.py,则会收到IndexError:

Traceback (most recent call last):
  File ".\foo.py", line 4, in <module>
    x = argv[1]
IndexError: list index out of range

结果,我有两个问题:

  • 这是一个错误还是在try-finally块中是预期的行为?
  • 我应该只在没有except子句的情况下才使用try-finally吗?

1 个答案:

答案 0 :(得分:3)

这是预期的行为。单独try:..finally:... 不会捕获异常。仅except的{​​{1}}子句。

try:...except:...仅保证try:...finally:...节中的语句始终执行,无论finally节中发生的任何事情,无论块是成功还是因try而退出, breakcontinue或例外。因此return在清理资源方面是伟大的;无论块中发生了什么,您都可以运行代码(但请注意,with statement和上下文管理器也可以封装清除行为)。如果您想查看示例,请访问Python standard library has hundreds

如果您需要在try:...finally:...块中处理IndexError异常,则必须使用try子句。您仍然可以使用except子句 ,它将在finally套件运行之后被调用。

如果您曾经使用过许多老版本的Python代码,则会发现在必须与Python 2.4或更早版本一起运行的代码中,excepttry:....finally:...从未一起使用。这是因为only as of Python 2.5两种形式都统一了。