代码之家  ›  专栏  ›  技术社区  ›  kbs

如何在不将错误处理写入函数的情况下创建自定义错误处理类

  •  0
  • kbs  · 技术社区  · 7 年前

    我试图创建一个只处理错误的类。调用函数时使用类方法,这样,如果用户输入错误,错误处理类中的方法将停止函数的执行。

    class Error(Exception):
        pass
    
    class UserError(Error):
        def handle_even(number):
            try: number % 2 == 0    
            except: raise UserError.handle_even('error: odd number\n')
        def handle_odd(number):
            try: number % 2 != 0
            except: raise UserError.handle_odd('error: even number\n')
    
    
    def take_even(number):
        print(number) #if user input is bad, this shouldn't execute
    
    def take_odd(number):
        print(number) #if user input is bad, this shouldn't execute
    
    
    
    take_even(UserError.handle_even(5)) # I expect this to print 'error: odd number'
    take_odd(UserError.handle_odd(4)) # I expect this to print 'error: even number'
    

    所以,我想要的输出是:

    error: odd number
    error: even number
    

    但是,我得到的结果是:

    None
    None
    
    0 回复  |  直到 7 年前
        1
  •  7
  •   Khalid Ali    7 年前

    这个 try 块不会生成异常,因为表达式计算为真/假,而且奇数/偶数检查逻辑错误。

    class Error(Exception):
        pass
    
    class UserError(Error):
        @classmethod
        def handle_even(cls, number):
            if number % 2 != 0:
                raise Error('error: odd number\n')
    
            return number
    
        @classmethod
        def handle_odd(cls, number):
            if number % 2 == 0:
                raise Error('error: even number\n')
    
            return number
    
    
    def take_even(number):
        print(number) # if user input is bad, this won't execute
    
    def take_odd(number):
        print(number) # if user input is bad, this won't execute
    
    # This will raise an 'Error' exception (error: odd number)
    take_even(UserError.handle_even(5))
    
    # This will raise an 'Error' exception (error: even number)
    take_odd(UserError.handle_odd(4))
    

    你可以处理这些具体的 Error 例外情况如下:

    try:
        take_even(UserError.handle_even(5))
    except Error as e:
        print(e) # print 'error: odd number'
    
    try:
        take_odd(UserError.handle_odd(4))
    except Error as e:
        print(e) # print 'error: even number'
    

    编辑: 根据@nathanv_“rzemnieks建议将方法更改为类方法。