首页 > 解决方案 > 在python中的语句引发异常

问题描述

我是 python 新手,我想创建一个简单的银行账户类,我想在其中创建一个提取方法,检查发现是否足够,如果没有则引发异常。

   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}")

这就是我到目前为止所拥有的,并且逻辑是有效的,但我认为最好使用

try:
    # method logic
except Exception:
    #handle exception and continue program

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

  if amount < self.amount:

当你想在某个事件上抛出异常,然后继续程序时,你在 python 中做什么?

标签: python

解决方案


异常的目的是让函数向其调用者表明它无法做它打算做的任何事情。

因此,如果您有一个名为 的函数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()该帐户时不存在,那么以不同的方式失败可能是可以的。如果您未能处理可能的异常,则默认情况是您的程序崩溃。这是一件好事:这意味着您发现了一些忘记编写的代码,如果发生这种情况,您的程序完全停止运行比继续做错事要好得多。


推荐阅读