为啥没有显示 ValueError 异常?

Posted

技术标签:

【中文标题】为啥没有显示 ValueError 异常?【英文标题】:Does anyone know why the ValueErrorException is not showing?有谁知道为什么没有显示 ValueError 异常? 【发布时间】:2020-03-08 13:22:24 【问题描述】:
class ValueErrorException(Exception):
    pass

class BankAccount(object):

    def __init__(self, balance):
        self.balance = balance


    def balance(self):
        if self.balance<0:
            raise ValueErrorException("Illegal Balance")
        else:
            return self.balance
x = BankAccount(-10)

print(x.balance)

应该打印错误,但它打印 -10。我究竟做错了什么?

【问题讨论】:

【参考方案1】:

您为此BankAccount 类定义了一个属性.balance 和一个方法.balance()。因为它们具有相同的名称,所以一个会覆盖另一个。确保它们具有单独的名称,例如:

class BankAccount(object):
    def __init__(self, balance):
        self._balance = balance

def balance(self):
    if self._balance<0:
        raise ValueErrorException("Illegal Balance")
    else:
        return self._balance

然后调用你的.balance() 方法(注意括号):

>>> x = BankAccount(-10)
>>> print(x.balance())

这应该引发所需的异常。

【讨论】:

【参考方案2】:

init 中,您将值 -10 分配给 self.balance,您从不调用方法 balance()。您可能想要的是使用属性和设置器。这样,每次为 balance 分配一个值时,都会执行一次检查:

class BankAccount(object):

    def __init__(self, balance):
        self.balance = balance

    @property
    def balance(self):
        return self._balance

    @balance.setter
    def balance(self, value):
        if value < 0:
            raise ValueError("Illegal Balance")
        self._balance = value

另外,ValueError 是 python 内置的异常,你不需要自己的 Exception 类。

【讨论】:

以上是关于为啥没有显示 ValueError 异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有字符串解析的情况下解析 Python 中的 ValueError?

为啥逻辑回归会抛出转换错误(valueerror)?

Python ValueError 异常没有被正确捕获

为啥 asp.net 5 剃须刀页面中没有开发人员异常页面?

为啥在匿名 PL/SQL 块中没有立即引发异常?

GridSearchCV 和 ValueError:估计器管道的参数 alpha 无效