在使用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
。 只捕捉你准备处理的错误。