我在多个函数中打开文件,保持“优雅”处理潜在的 IOErrors 似乎有点混乱/多余:
try:
fileHandle = open(file, 'r')
except:
print "Error: failed to open file %s" % (file)
sys.exit(2)
在什么情况下可以接受:
fileHandle = open(file, 'r')
并期望用户在异常情况下关注回溯消息?
我在多个函数中打开文件,保持“优雅”处理潜在的 IOErrors 似乎有点混乱/多余:
try:
fileHandle = open(file, 'r')
except:
print "Error: failed to open file %s" % (file)
sys.exit(2)
在什么情况下可以接受:
fileHandle = open(file, 'r')
并期望用户在异常情况下关注回溯消息?
这是在 Python 和其他语言中实现的异常原则。引发异常的函数不需要本地的异常处理。
如果一些本地处理是有意义的,那就去做吧。如果您不能做任何有用的事情,只需让异常在调用堆栈中上升,直到找到适当的异常处理程序。
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
使用“with”关键字。
with open(file, 'r') as fileHandle:
do_whatever()
这段代码或多或少等同于
try:
fileHandle = open(file, 'r')
except IOError:
pass
else:
do_whatever()
finally:
fileHandle.close()
基本上,它确保您正确打开和关闭文件,并捕获异常。
将您的应用程序包装在外部尝试/除了打印一些更好的东西并记录血淋淋的细节。我没有在这里设置记录器,但你明白了:
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)