在Python中,try语句支持else子句,如果try块中的代码不引发异常,则执行该子句。例如:
try:
f = open('foo', 'r')
except IOError as e:
error_log.write('Unable to open foo : %s\n' % e)
else:
data = f.read()
f.close()
为什么需要else子句?我们不能按如下方式编写上述代码:
try:
f = open('foo', 'r')
data = f.read()
f.close()
except IOError as e:
error_log.write('Unable to open foo : %s\n' % e)
如果open没有引发异常,执行是否会继续执行data = f.read()
?
答案 0 :(得分:14)
如果在f.read()或f.close()代码中出现错误,则会出现差异。在这种情况下:
try:
f = open('foo', 'r')
data = f.read()
f.close()
except IOError as e:
error_log.write('Unable to open foo : %s\n' % e)
在这种情况下,f.read()
或f.close()
中的错误会为您提供日志消息"Unable to open foo"
,这显然是错误的。
在这种情况下,可以避免这种情况:
try:
f = open('foo', 'r')
except IOError as e:
error_log.write('Unable to open foo : %s\n' % e)
else:
data = f.read()
f.close()
读取或关闭时的错误不会导致日志写入,但错误会在调用堆栈中向上移动。
答案 1 :(得分:3)
else
子句没有引发异常,则 try
用于必须执行的代码。
使用else
优于额外的try
子句,因为else
可以避免意外捕获由try except
语句保护的代码未引发的异常。
答案 2 :(得分:2)
根据我的理解,else
子句用于将try块的范围限制为您尝试管理异常的代码。或者,您的try
块更大,您可能会捕获您不想捕获的异常。
答案 3 :(得分:0)
@约翰:
我认为在Java或其他语言中,您有不同的例外。例如像FileNotFound Exception(或类似的东西,我不确定名称)
这样您就可以处理不同的异常并采取相应的行动。然后你知道为什么错误发生了,因为打开或关闭。