Python:需要捕获open()异常吗?

时间:2013-06-07 18:38:20

标签: python coding-style

我在多个函数中打开文件,保持'优雅'处理潜在的IOErrors似乎有点混乱/多余:

try:  
    fileHandle = open(file, 'r')  
except:  
    print "Error: failed to open file %s" % (file)  
    sys.exit(2)

在什么情况下可以接受:

fileHandle = open(file, 'r')

并期望用户在异常情况下眼球回溯消息?

3 个答案:

答案 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()

基本上,它确保您正确打开和关闭文件,并捕获异常。