我在多个函数中打开文件,保持'优雅'处理潜在的IOErrors似乎有点混乱/多余:
try:
fileHandle = open(file, 'r')
except:
print "Error: failed to open file %s" % (file)
sys.exit(2)
在什么情况下可以接受:
fileHandle = open(file, 'r')
并期望用户在异常情况下眼球回溯消息?
答案 0 :(得分:2)
这是在Python和其他语言中实现的异常原则。异常处理不必要的 local 到引发异常的函数。
如果某些本地处理有意义,请执行此操作。如果您无法做任何有用的事情,只需让异常在调用堆栈中上升,直到找到正确的异常处理程序。
http://docs.python.org/2/tutorial/errors.html#handling-exceptions
如果捕获异常只是为了记录它,您可能需要重新提升它:
try:
fileHandle = open(file, 'r')
except IOError:
print "Error: failed to open file %s" % (file, )
raise
http://docs.python.org/2/tutorial/errors.html#raising-exceptions
答案 1 :(得分:1)
将您的应用程序包装在外部尝试/除了打印更好的东西并记录血腥细节。我没有在这里设置记录器,但是你得到了漂移:
import os
import sys
import logging
import traceback
try:
my_application(params)
except (OSError, IOError), e:
message = "%s - %s." % (e.filename, e.sterror)
sys.stderr.write("Error: %s. See log file for details%s" % (message, os.linesep))
logger.error('myapp', message)
for line in traceback.format_exc().split(os.linesep):
logger.warn('myapp', line)
sys.exit(2)
答案 2 :(得分:1)
使用'with'关键字。
with open(file, 'r') as fileHandle:
do_whatever()
此代码或多或少等同于
try:
fileHandle = open(file, 'r')
except IOError:
pass
else:
do_whatever()
finally:
fileHandle.close()
基本上,它确保您正确打开和关闭文件,并捕获异常。