簡體   English   中英

在python中的語句引發異常

[英]Raise exception upon statement in 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}")

到目前為止,這是我所擁有的,並且邏輯正在起作用,但是我認為使用A會更好

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

我的問題是我無法在類似以下語句的情況下觸發異常:

  if amount < self.amount:

當您想在某個事件上引發異常然后繼續執行程序時,您在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()該帳戶不存在,那么以其他方式失敗也可以。 如果您無法處理可能的異常,則默認情況是程序崩潰。 這是一件好事:這意味着您已經找到了一些忘記編寫的代碼,如果發生這種情況,那么最好是程序完全停止運行而不是繼續執行錯誤的操作。

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

編輯: 一種更好的方法是代替打印“資金不足”以寫入日志文件或將輸出返回給調用此類/函數的程序

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM