根据上下文管理器的 数据模型文档:
请注意,
__exit__()
方法不应该重新引发传递进来的异常,这应该由调用者负责。
我有一个临时文件,我想用 close
方法释放它的文件描述符,但是不想将任何内容写入磁盘。我的直觉解决方案是传递异常,但是文档中不鼓励使用,肯定有充分的理由。
class Processor(object):
...
def write(self, *args, **kwargs):
if something_bad_happens:
raise RuntimeError('This format expects %s columns: %s, got %s.' % (
(len(self.cols), self.cols, len(args))))
self.writer.writerow(args)
def __enter__(self):
return self
def __exit__(self, type, value, traceback):
# the RuntimeError from write will be set as type, value and so on ..
# I'd like to close the stream here (release the file descriptor),
# but I do not leave a trace of the associated file -
# (one can always 'manually' delete with `os.remove` but maybe there's a
# better way ..?)
self.output_pipe.close()
此特定情况下,我不希望调用方进行错误处理,原因有两个:
- 保持调用方代码的简洁性(见下文)
- 调用方对异常处理方式感到满意(我们希望快速失败)
上下文管理器的使用方法如下:
class Worker(object):
...
def run(self):
# output setup so it will emit a three column CSV
with self.output().open('w') as output:
output.write('John', 'CA', 92101)
output.write('Jane', 'NY', 10304)
# should yield an error, since only three 'columns' are allowed
output.write('Hello', 'world')
更新:我的问题表述有些不清晰,实际上我的问题可以归结为以下内容:在嵌套的上下文管理器中,如何将异常传递给最外层的上下文管理器?
__exit__
中两次关闭输出吗? - user2357112output_pipe
。 - miku