2011-07-09 88 views
2

Why is else clause needed for try statement in python ? 尝试...除了......还有v嵌套的尝试......除了

把它推向深入:

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 clause解决仍然能够避免发生在我由nested try...except避免需要else? :

try: 
    f = open('foo', 'r') 
    try: 
    data = f.read() 
    f.close() 
    except: 
    pass 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 

回答

6

try..except..else可能不需要,但它可能是好的。在这种情况下,在我看来,try..except..else形式明显更好。

仅仅因为你可以没有语法元素,也不会使它无用。 Decorator的语法纯粹是语法糖(我认为最明显的例子),for循环只是被优化的循环,等等。 try..except..else有一个好地方,我会说这是一个这样的地方。

此外,这两个代码块是非常相似的。如果f.read()引发异常(磁盘读取错误,文件内部的数据损坏或其他类似问题),第一个将会引发异常,但第二个会失去它,并认为一切正常。至于我自己,我宁愿沿着这些路线的更多的东西,这是短,还是比较容易理解:

try: 
    with open('foo', 'r') as f: 
     data = f.read() 
except IOError as e: 
    error_log.write('Unable to open foo : %s\n' % e) 

(假设你想赶上在file.readfile.close错误,我真的不能明白为什么你不会。)

+0

并且不能让代码工作。我得到无效的语法。 –

+0

@eryksun:啊,是的,忘记了。我刚刚检查了Python文档和[With'语句](http://docs.python.org/reference/compound_stmts.html#with)只是说“版本2.5中的新功能”。而没有提到需要'__future__'导入,所以我想到'除了'''。 Python文档中的“复合语句”页面没有提及它何时被添加......并且我不记得。 –

+0

很高兴知道谢谢 –

0

实际上,并不总是需要,你可以简单地做:

f = None 
try: 
    f = open('foo', 'r') 
except IOError: 
    error_log.write('Unable to open foo\n') 
if f: 
    data = f.read() 
    f.close() 
+0

但你然后调用'None(读)()'''这引发'AttributeError' –

+0

抱歉修复!我还在编辑。 –

+0

你确定'如果不是f'会起作用吗?我想这应该是'如果f' –