我必须打开&在同一个循环中写入大约10个不同的文件。 e.g:
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可能需要一个用多个变量格式化的字符串。将开放/写入过程概括为循环并不会很好地工作。
答案 0 :(得分:28)
您可以使用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
块中的执行显然仍会在第一个异常后停止。
答案 1 :(得分:12)
使用traceback模块:
traceback.print_exc()
答案 2 :(得分:2)
你提到使用循环,但你实际上并没有使用循环。使用循环。这样,您可以在单个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)
答案 3 :(得分:2)
使用exc_type, value, exc_traceback = sys.exc_info()
时,请注意可以通过以下方式获取生成异常的文件名:
exc_traceback.tb_frame.f_locals.get('filename')