在Python中获取异常详细信息

use*_*876 18 python error-handling exception python-3.3

我必须在同一个循环中打开和写入大约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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

...当我必须为大约10个不同的文件执行此操作时,哪个会变得非常笨重且没有吸引力.有没有办法从我的第一个例子中获取(例如)一般异常中的文件名信息?基本上,异常可以报告诸如"写入文件1时的错误"而没有尝试/除了专门用于file1操作.

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

Cai*_*von 32

您可以使用sys.exc_info获取有关当前正在处理的异常的信息,包括异常对象本身.一个IOError例外,包含了所有你需要的信息,包括文件名,错误号,以及一个描述错误的字符串:

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))
Run Code Online (Sandbox Code Playgroud)

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


rst*_*use 16

使用traceback模块:

traceback.print_exc()
Run Code Online (Sandbox Code Playgroud)


Bre*_*arn 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)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

  • @user891876:更一般地说,决定如何处理每个文件的逻辑越复杂,就越难避免“笨重”的代码。如果您尝试对 10 个文件执行 10 组完全不同的复杂操作,那么这不是一次操作,而是 10 次操作,并且您不能指望能够一次完成所有这些操作。不过,您应该在打开文件之前尽可能完成笨重的部分,因为这将有助于将创建数据时的逻辑错误(在您的控制之下)与写入数据时的 I/O 错误(这可能会在您的控制之下)分开。不受你的控制)。 (2认同)