2011-01-29 106 views
10

在Python中,try语句支持else子句,如果try块中的代码不引发异常,则执行该子句。例如:为什么python中的try语句需要else子句?

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) 

不会执行继续data = f.read()如果开不引发异常?

回答

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() 

而且在读或关闭错误不会导致日志写入,但错误将上升uncatched向上调用堆栈。

+1

谢谢Lennart。这很清楚! :)。那么,为什么我们不会在其他语言(如说Java)中看到else子句呢? :) – John 2011-01-29 10:01:48

2

根据我的理解,else子句用于将try块的范围限制为您试图管理异常的代码。或者,您的try区块较大,您可能会发现您无意捕捉的异常。

3

else用于代码必须如果try条款引发异常执行。

使用else比额外try条款更好,因为else可以避免不小心抓,这不是由try except声明保护的代码引发异常。

0

@John:
我觉得在诸如Java或其他语言的语言中,您有不同的例外。例如,像FileNotFound异常(或类似的东西,我不知道名称)。
这样你可以处理不同的例外,并采取相应的行动。然后你知道为什么错误发生了,因为打开或关闭。