1

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

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

在什么情况下可以接受:

fileHandle = open(file, 'r')

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

4

3 回答 3

2

这是在 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

于 2013-06-07T19:21:39.593 回答
1

使用“with”关键字。

with open(file, 'r') as fileHandle:
    do_whatever()

这段代码或多或少等同于

try:
    fileHandle = open(file, 'r')
except IOError:
    pass
else: 
    do_whatever()
finally:
    fileHandle.close()

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

于 2013-06-07T19:58:05.290 回答
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)
于 2013-06-07T19:03:46.860 回答