在python中对语句引发异常

2024-06-06 07:20:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我是python的新手,我想创建一个简单的bank account类,在这个类中我要创建一个提取方法,该方法检查资金是否足够,如果不够,则引发异常。在

   def withdraw(self, amount):
        self.amount -= amount
        if amount < self.amount:
            raise Exception("Insufficent founds")
        print(f"{amount} was withdrawn new balance is {self.amount}")

这就是我目前所拥有的,逻辑是可行的,但我认为最好是

^{pr2}$

我的问题是我不能在以下语句中触发异常:

  if amount < self.amount:

在python中,当您希望对某个事件引发异常,然后继续该程序时,您要做什么?在


Tags: 方法selfifdefexceptionaccountamountraise
2条回答

try/except只在python中获取特定的错误并防止崩溃,这样程序就可以继续运行(如果中断,就不能继续运行)。如果不指定python的异常,它将处理它发生的任何异常。在

try:
    # something
except:
    pass #(do nothing)

但是,如果您不想只处理特定的错误,即只捕捉/忽略它,而其他人将有其他处理方法(甚至在屏幕上崩溃),您可以指定:

^{pr2}$

当你知道程序崩溃时,它不会停止。

您可以退出if中的函数,但必须在操作之前进行检查:

def withdraw(self, amount):

    if amount < self.amount:
        print("Insufficent funds")
        return

    self.amount -= amount
    print(f"{amount} was withdrawn new balance is {self.amount}")

编辑:更好的方法是将“资金不足”打印到中,写入日志文件或将输出返回到调用该类/函数的程序中。在

异常的目的是让函数向它的调用者指明它不能做它想做的任何事情。在

因此,如果您有一个名为withdraw的函数,它的目的是提取资金,如果出于任何原因它不能提取资金,那么该函数引发一个异常是合适的。在

如果函数识别出一种情况,即它可以提取资金,并且它执行一些额外的步骤(如提示用户)然后成功,那么就不需要任何异常。这个函数仍然做了它想要做的事情。但是,让withdraw函数承担请求批准的额外责任,对我来说似乎是一个糟糕的设计。在

帮助理解需要引发哪些异常的一种方法是自上而下工作,而不是自下而上。也就是说,先写下你想让你的程序做什么的最高层次,然后再深入到具体细节。在

例如,如果您的目标是模拟ATM机,则可以从以下顶层函数开始:

def main():
    while running:
        account = select_account()
        operation = select_operation()

        if operation == 'withdraw':
            amount = select_amount()
            try:
                account.withdraw(amount)
            except InsufficientFundsError:
                print('Your account has insufficient funds.')

        elif operation == 'deposit':
            amount = select_amount()
            account.deposit(amount) 

        elif operation == 'done':
            running = False

如果您从这个将使用您的类的“客户机”代码开始,它将使“服务”代码(您的Account类)的设计变得更加容易。现在你知道了你想如何使用你的对象,所以你只需要写一个可以这样使用的对象。在

当您编写对account.withdraw(amount)这样的函数的调用时,您需要考虑:这怎么会失败?如果失败了我该怎么办?例如,如果失败的原因是资金不足,您希望打印一条消息,但您可能不想中止程序。但是,如果您调用select_account()该帐户不存在,那么也许可以用另一种方式失败。如果未能处理可能的异常,则默认情况是程序崩溃。这是件好事:这意味着你发现了一些你忘记写的代码,如果发生这种情况,你的程序完全停止运行比继续做错误的事情要好得多。在

相关问题 更多 >