29

我必须在同一个循环中打开并写入大约 10 个不同的文件。例如:

for i in range(0,10):
    try:
        a=5
        file1 = open("file1.txt",'w+')
        file2 = open("file2.txt",'w+')
        #... etc

        print(str(a),file=file1)
        print(str(a)+"hi",file=file2)
        # ... etc
    except: 
        #error handling

现在我想做的是能够获取特定的异常信息,例如在一般异常中打开/写入的文件。根据我目前的理解,我必须做这样的事情来实现我想要的:

for i in range(0,5):
    a=5
    try:
        file1 = open("file1.txt",'w+')
        print(str(a),file=file1)
    except: 
        #error handling for file1
    try:
        file2 = open("file2.txt",'w+')
        print(str(a)+"hi",file=file2)
    except: 
        #error handling for file2

...当我必须为大约 10 个不同的文件执行此操作时,这将变得非常笨重且没有吸引力。有没有办法从我的第一个示例中的一般异常中获取(例如)文件名信息?基本上,因此异常可以报告诸如“写入file1时出错”之类的内容,而无需尝试/专门针对file1操作。

编辑:这是对写入文件的数据的过度简化。str(a) 和 str(a)+"hi" 并不能很好地表示实际写入的数据;file1 可能需要一个硬编码的整数,而 file2 可能需要一个用多个变量格式化的字符串。将打开/写入过程概括为一个循环不会很好地工作。

4

4 回答 4

47

您可以使用sys.exc_info来获取有关当前正在处理的异常的信息,包括异常对象本身。异常IOError包含您需要的所有信息,包括文件名、errno 和描述错误的字符串:

import sys

try:
    f1 = open('example1')
    f2 = open('example2')
except IOError:
    type, value, traceback = sys.exc_info()
    print('Error opening %s: %s' % (value.filename, value.strerror))

在第一个异常之后,块中的执行try显然仍会停止。

于 2013-04-08T23:44:20.467 回答
23

使用回溯模块:

traceback.print_exc()
于 2015-03-05T21:31:10.320 回答
3

您提到使用循环,但实际上并没有使用循环。使用循环。这样您就可以在一个try块内一次写入每个文件。除了为每个文件写入一个值外,您似乎没有对文件做任何事情,因此您不需要将它们全部打开。

for filename in ['file1.txt', 'file2.txt', ...]:
    try:
        with open(filename, 'w+') as f:
            f.write(str(a)+"whatever")
    except IOError:
        print("Error occurred with", filename)

编辑:如果您要写入不同文件的内容大相径庭,请提前创建字典或其他数据结构,以存储文件和数据之间的映射,然后在循环中使用它。

data = {'file1.txt': str(a), 'file2.txt': 'something else', 'file3.txt': str(a)+str(b)}

for filename, output in data.items():
    try:
        with open(filename, 'w+') as f:
            f.write(output)
    except IOError:
        print("Error occurred with", filename)
于 2013-04-08T19:21:57.820 回答
3

使用exc_type, value, exc_traceback = sys.exc_info()时注意,产生异常的文件名可以通过以下方式获取:

exc_traceback.tb_frame.f_locals.get('filename')
于 2017-04-30T23:19:29.760 回答