【问题标题】:Toggle between warning and error in python在 python 中的警告和错误之间切换
【发布时间】:2021-05-12 04:55:59
【问题描述】:

假设我有一个函数可以对传入的值进行多次检查。

通常情况下,违规行为会向用户发出警告,用户会注意到并相应地纠正。这需要通过可选输入进行调整,因此会根据参数输出错误或警告。

下面的 sn-p 只会创建一个 TypeError 对象,因为它需要被提升。

def is_even(a: int, on_error: Literal["warn", "error"] = "warn") -> bool:
    error_handler = ValueError if on_error == 'error' else warnings.warn
    if a % 2 == 0:
        return True
    else:
        error_handler(f"{a=} is not an even number.")
        return False

有没有办法将 raise TypeError 分配给变量,或者在不退出函数的情况下引发警告?

鉴于函数中的检查数量,赋值将大大提高可读性,因为它避免了每次检查时的 if-else 语句。

【问题讨论】:

    标签: python error-handling warnings


    【解决方案1】:

    你可以这样做:

    def is_even(a: int, on_error: Literal["warn", "error"] = "warn") -> bool:
        try:
            if a % 2 == 0:
                return True
            else:
                raise ValueError(f"{a=} is not an even number.")
       
            ... < other checks that will also raise ValueError if not passed>
    
        except ValueError as ex:
            if on_error == 'error':
                raise
            else:
                warnings.warn(str(ex))
                return False
    

    注意except 块中的空raise 语句会重新引发相同的异常。

    另一个更接近您尝试过的解决方案是:

    def is_even(a: int, on_error: Literal["warn", "error"] = "warn") -> bool:
        def raise_error(m):
            raise ValueError(m)
    
        error_handler = raise_error if on_error == 'error' else warnings.warn
        
        if a % 2 == 0:
            return True
        else:
            error_handler(f"{a=} is not an even number.")
            return False
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多