我对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
结果,我有两个问题:
except
子句的情况下才使用try-finally吗?答案 0 :(得分:3)
这是预期的行为。单独try:..finally:...
不会捕获异常。仅except
的{{1}}子句。
try:...except:...
仅保证try:...finally:...
节中的语句始终执行,无论finally
节中发生的任何事情,无论块是成功还是因try
而退出, break
,continue
或例外。因此return
在清理资源方面是伟大的;无论块中发生了什么,您都可以运行代码(但请注意,with
statement和上下文管理器也可以封装清除行为)。如果您想查看示例,请访问Python standard library has hundreds。
如果您需要在try:...finally:...
块中处理IndexError
异常,则必须使用try
子句。您仍然可以使用except
子句 ,它将在finally
套件运行之后被调用。
如果您曾经使用过许多老版本的Python代码,则会发现在必须与Python 2.4或更早版本一起运行的代码中,except
和try:....finally:...
从未一起使用。这是因为only as of Python 2.5两种形式都统一了。