【发布时间】:2016-05-12 10:06:10
【问题描述】:
我想知道是否有办法在另一个装饰器中捕获一个装饰器引起的所有异常并处理这些异常。
但是,在为我的问题想出某种复杂的解决方案之前,我想我会问专家,看看我是否遗漏了什么。
我的应用程序如下所示:
输入将作为numGen 函数给出。这个numGen 函数将输入添加到随机数。在我的示例中,我正在检查 10 个不同的随机数。
请注意,输入以及随机数生成的范围也会有所不同。
一旦您在 Python 中点击引发用户定义的异常,似乎无法恢复执行测试。但在我的场景中,我想检查不同输入值发生的错误。但是当前的实现限制了继续检查不同输入向量的错误。
但是,在为我的问题想出某种复杂的解决方案之前,我想我会问专家,看看我是否遗漏了什么。不幸的是,如果不进行重大重构,我无法轻易改变这种范式。
我的应用程序如下所示: •输入将作为numGen 函数给出。此 numGen 函数将输入添加到随机数。在我的示例中,我正在检查 10 个不同的随机数。 •注意输入也将随着随机数生成范围的变化而变化
**:编辑异常类
from random import randint
class RND_ERROR(Exception):
def __init__(self, ErrNum, *arg, **kwargs):
self.RND_ERR_NR = int(ErrNum)
self.RND_ERR_MSG = ""
if self.RND_ERR_NR == 0x00000000:
self.RND_ERR_MSG = "NO ERROR"
elif self.RND_ERR_NR == 0x00000001:
self.RND_ERR_MSG = "RANDOM NUMBER IS ONE"
elif self.RND_ERR_NR == 0x00000002:
self.RND_ERR_MSG = "RANDOM NUMBER IS TWO"
elif self.RND_ERR_NR == 0x00000003:
self.RND_ERR_MSG = "RANDOM NUMBER IS THREE"
else:
self.RND_ERR_MSG = "RANDOM NUMBER GREATER THAN THREE"
def __str__(self):
return "RND ERROR (0x%08X): %s" % (self.RND_ERR_NR,self.RND_ERR_MSG)
def __repr__(self):
return self.__str__()
def handleError(func):
errors =[]
def wrapper(arg1):
try:
result = func(arg1)
except MyException as e:
print errors.append(e)
return wrapper
def findError(func):
def wrapper(arg1):
result = func(arg1)
print result
for k, v in result.iteritems():
error_nr = v % 2
if error_nr ==0:
pass
elif error_nr > 0:
raise RND_ERROR(errornum) #edited lines
return wrapper
@handleError
@findError
def numGen(input):
from random import randint
result= {}
errors = []
for i in range(9):
j = (randint(0,4))
result[i] = input + j
result.update() # This line does nothing...
return result
if __name__ == '__main__':
numGen(4)
函数numGen:
此函数接受输入并生成 10 个随机数。 10 个随机数与索引一起保存在结果字典中。根据结果字典调用查找错误装饰器。
装饰者 1findError:
在特定条件下,它会针对不同的结果生成异常,如果发生错误,则会引发异常。
装饰者 2handleError:
捕获之前装饰器中引起的所有异常,追加到列表中。稍后再提出。
问题陈述:
我无法在 try 块中遍历字典,因此无法捕获特定错误。
我想检查每个输入是否发生错误,如果发生任何错误引发异常并存储哪个输入的信息 例如: - 针对不同的输入引发异常。捕获异常,并存储发生异常的输入值以及异常类型(例如)。
如何通过创建聚合异常(如 MyExceptionsCollection)来聚合异常,该异常将保存并引发数组而不是打印。
如何重新引发确切的异常或所有发生的异常
注意:实现必须使用 2 个装饰器,一个用于生成错误和捕获错误。因为我将有 200-250 个函数,所以我需要检查所有这些函数的错误
请帮助我如何实现这一目标。除了例外,任何更好的解决方案也是受欢迎的。
提前致谢
【问题讨论】:
-
您似乎正在尝试将异常机制用作消息管道。为什么不改用
multiprocessing.Pipe类? -
@max 您能否将异常机制的示例代码 sn-p 添加为消息管道?
-
我考虑了一下,并决定这里最好的解决方案是使用如下生成器 (pythonfiddle.com/exception-generator)。因为抛出会导致退出调用栈,所以你需要实现从某个点重新进入那里。
-
对应链接失效。要求你放示例代码sn-ps
-
对不起。将代码放在答案中。
标签: python exception dictionary python-decorators