[英]Python exception handling, detecting the function that caused the exception?
我正在尝试在项目中实现一些体面的异常处理。 我已经设置了以下我的代码的虚拟示例:
def task1():
pass
def task2():
"""Generic docstring"""
a = 4
b = c
def task3():
pass
def task4():
pass
def main():
try:
task1()
task2()
task3()
task4()
except Exception as ex:
print(ex)
finally:
print("All done")
main()
上面的代码几乎完成了我想要的。 它打印发生的错误(我会在真实代码中将其记录在文件中),但不幸的是它没有告诉我在哪个子函数中触发了异常,而且我没有看到任何获取此信息的选项。 我想我可以在每个子函数中有一个单独的 try/except 块,从 function 引发一条消息,但我更希望我不必这样做并且可以自动获取信息。
由于我在错误处理方面的经验相当有限,我也很想知道是否有人对我应该如何实施错误处理有替代/更好的解决方案。
我的用例是我需要并行运行这段代码,它很容易出错,因为它是在一堆外部文件上运行的,有时这些文件只包含错误,而有时它们的格式不是正是我的代码所期望的。 我需要运行数百万个文件,我不想让一个错误停止任何事情,我只希望它记录在一个文件中,这样我可以稍后查看错误并确定这些错误是否是可修复的错误。
编辑,基于@timgeb 提供的链接,我创建了以下内容,它完成了工作,但并不是那么漂亮。
import sys, traceback
def task1():
pass
def task2():
"""Generic docstring"""
a = 4
b = c
def task3():
pass
def task4():
pass
def main():
try:
task1()
task2()
task3()
task4()
except Exception as ex:
tb = sys.exc_info()[-1]
stk = traceback.extract_tb(tb, -1)
fname = stk[0][2]
print(f'The failing function was {fname} with error message {ex}')
finally:
print("All done")
main()
您可以使用循环,以便循环索引保持分配给最后一次尝试的 function。
try:
for x in [task1, task2, task3, task4]:
x()
except Exception as ex:
print(f'{ex} raised by {x}')
finally:
print("All done")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.