在使用Python with语句时捕捉exception

令我惭愧的是,我无法弄清楚如何用python语句处理exception。 如果我有一个代码:

with open("a.txt") as f: print f.readlines() 

我真的想处理'文件未findexception',以做到somehing。 但我不能写

 with open("a.txt") as f: print f.readlines() except: print 'oops' 

不能写

 with open("a.txt") as f: print f.readlines() else: print 'oops' 

在try / except语句中加上'with'不起作用else:不会引发exception。 我能做些什么来以Pythonic的方式在'with'语句中处理失败?

 from __future__ import with_statement try: with open( "a.txt" ) as f : print f.readlines() except EnvironmentError: # parent of IOError, OSError *and* WindowsError where available print 'oops' 

如果您需要对公开呼叫与工作代码进行不同的处理,您可以执行以下操作:

 try: f = open('foo.txt') except IOError: print('error') else: with f: print f.readlines() 

最好的“Pythonic”方法是利用with语句,在PEP 343中列举为Example#6,它给出了语句的背景。

 @contextmanager def opened_w_error(filename, mode="r"): try: f = open(filename, mode) except IOError, err: yield None, err else: try: yield f, None finally: f.close() 

用法如下:

 with opened_w_error("/etc/passwd", "a") as (f, err): if err: print "IOError:", err else: f.write("guido::0:0::/:/bin/sh\n") 

在使用Python with语句时捕捉exception

自从Python 2.6以来 ,with语句就没有__future__导入。

这是最接近你纠正的事情。 你快到了:

 with open("a.txt") as f: print(f.readlines()) except: print('oops') 

上下文pipe理器的__exit__方法,如果返回False则会在完成时重新显示错误。 如果它返回True ,它会压制它。 open内置的__exit__不返回True ,所以你只需要尝试嵌套它,除了块:

 try: with open("a.txt") as f: print(f.readlines()) except Exception as error: print('oops') 

标准样板:不要使用except:捕获BaseException和其他可能的exception和警告。 至less要像Exception一样具体,并且对于这个错误,可能会捕获IOError 。 只捕捉你准备处理的错误。