gpt4 book ai didi

python - 在异常中向上传递信息?

转载 作者:太空宇宙 更新时间:2023-11-03 23:58:42 25 4
gpt4 key购买 nike

在长时间运行的进程中,我在函数的某个循环深处遇到异常。如果出现异常,我想记录发生异常的循环中索引处的内容。不幸的是,我需要的信息在当前函数中不可用……它在堆栈的下一个函数中。但是,索引在堆栈上的下一个函数中不可用,它仅在当前函数中可用。因此,为了记录适当的信息,我需要来自不同嵌套级别的两个函数调用的信息。如何在 Exception 中的函数之间传递信息?

例如:

def foo():
information_I_need = ["some", "arbitrary", "things"]
data_operated_on = list(range(0, 10*len(information_I_need), 10)) #0,10,20
#NB: these two lists are the same size
try:
bar(data_operated_on)
except ValueError as e:
i = e.get_the_index_where_bar_failed()
print(information_I_need[i])

def bar(aoi):
for i in range(len(aoi)):
try:
fails_on_10(aoi[i])
except ValueError as e:
e.add_the_index_where_bar_failed(i)
raise e

def fails_on_10(n):
if n == 10:
raise ValueError("10 is the worst!")

这里的预期行为是调用 foo() 打印 "arbitrary"

在此示例中,bar 具有foo 正确报告问题所需的信息(即索引i)。我如何获取从 barfoo 的信息?

最佳答案

您可以将索引添加为异常对象的属性。

最好使用自定义异常类来执行此操作,而不是使用内置异常之一。

class BadInformation(Exception):
def __init__(self, message, index):
# py2/3 compat
# if only targeting py3 you can just use super().__init__(message)
super(BadInformation, self).__init__(message)
self.bad_index = index

def foo():
information_I_need = ["some", "arbitrary", "things"]
data_operated_on = list(range(0, 10*len(information_I_need), 10)) #0,10,20
#NB: these two lists are the same size
try:
bar(data_operated_on)
except BadInformation as e:
i = e.bad_index
print(information_I_need[i])

def bar(aoi):
# if you need both the index and value, use `enumerate()`
for index, value in enumerate(aoi):
try:
fails_on_10(value)
except ValueError as e:
raise BadInformation(str(e), index)
## on py 3 you may want this instead
## to keep the full traceback
# raise BadInformation(str(e), index) from e



def fails_on_10(n):
if n == 10:
raise ValueError("10 is the worst!")

关于python - 在异常中向上传递信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56539728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com