我是python的新手,我想创建一个简单的银行帐户类,在这里我要创建一个提现方法,该方法检查发现是否足够,然后引发异常。
Visio
这是我到目前为止所拥有的,并且逻辑还在起作用,但是我认为使用a会更好。
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
当您想在某个事件上引发异常然后继续执行程序时,您在python中做什么?
答案 0 :(得分:4)
异常的目的是使函数向调用方表明 ,该函数无法执行其打算要做的任何事情。
因此,如果您有一个名为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()
时该帐户不存在,那么以其他方式失败也可以。如果您无法处理可能的异常,则默认情况是程序崩溃。这是一件好事:这意味着您已经找到了一些忘记编写的代码,如果发生这种情况,那么最好是程序完全停止运行而不是继续执行错误的操作。
答案 1 :(得分:0)
try / except仅在python中获得特定的错误并防止崩溃,因此程序可以继续运行(如果中断则不能运行)。如果您不指定python的异常,它将处理发生的任何异常。
try:
# something
except:
pass #(do nothing)
但是,如果您不想只处理特定的错误,即只捕获/忽略该错误,但是其他人将得到其他处理(甚至在屏幕上崩溃),您可以指定:
div = 0
try:
print(10/div)
except ZeroDivisionError:
print("div can't be zero, change variable")
return # this exits the function
#break # if it is inside a loop
基本上, 当您处理异常时,程序不会停止运行,它就像一个“已知错误”,因此不会崩溃。
您可以做的是退出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}")
编辑: 一种更好的方法 是将“资金不足”打印到 而不是写入日志文件或返回输出 调用该类/函数。