繁体   English   中英

Python异常处理,检测到引发异常的function?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM