如何在装饰器中捕获相同类型的多个异常

我想知道是否有办法捕获在另一个装饰器中的一个装饰器中引起的所有异常并处理这些异常.

然而,在对我的问题提出某种复杂的解决方案之前,我想我会问专家,看看是否有我遗漏的东西.

我的应用程序看起来类似于:

输入将作为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)

功能号码:

此函数接受输入并生成10个随机数. 10个随机数保存在带索引的结果字典中.查找错误装饰器在结果字典中称为基础.

装饰者1 findError:

在特定条件下,它会为不同的结果生成异常,如果发生错误,则会引发异常.

装饰者2 handleError:

捕获先前装饰器中导致的所有异常,追加到列表中.再加点后来.

问题陈述:

>我无法在try块中迭代字典,所以我无法捕获特定的错误.
>我想检查每个输入是否发生错误以及是否发生任何错误引发异常并存储哪个输入的信息
例如:
     – 针对不同的输入提高异常.捕获异常,并存储发生异常的输入值以及异常类型(比如说).
>如何通过创建聚合异常来聚合异常,例如MyExceptionsCollection,它将保存数组并提升它而不是打印.
>如何重新确定已发生的确切异常或所有异常

注意:实现必须使用2个装饰器,用于生成错误和捕获错误.因为我将有200到250个函数,所以我需要检查所有这些函数的错误

请帮助我如何实现这一目标.任何更好的解决方案,除了例外也欢迎.

提前致谢

最佳答案
我建议使用生成器而不是抛出异常:

class MyException(Exception):pass


def handleError(func):
    errors =[]
    def wrapper(arg1):
        result = func(arg1)

        for err in findError(result):
            errors.append(err)

        print errors
        return result

    return wrapper

def findError(result):
    print result
    for k, v in result.iteritems():
        error_nr = v % 2
        if error_nr ==0:
            pass
        elif error_nr > 0:
            yield MyException

@handleError
def numGen(input):
    from random import randint
    result= {}
    errors = []
    for i in range(9):
        j = (randint(0,4))
        result[i] = input + j
    return result

if __name__ == '__main__':
    numGen(4)

转载注明原文:如何在装饰器中捕获相同类型的多个异常 - 代码日志