簡體   English   中英

python 3 中的 try/except 問題語句

[英]try/except issue statement in python 3

您好,我是 Python 和學習基礎知識的新手。 我很想了解 Python 中的 try/except 語句,我想問一下我是否應該盡可能少地保留如下所述的 try 塊/部分(請參閱以下代碼正常工作)或嘗試盡可能多地保留在 try 塊/部分(請參閱以下代碼在我輸入任何字符串時無法正常工作,但在我輸入浮點數/整數時它工作)。

因此,這兩種情況幾乎相同,但是當我輸入字符串時,另一個代碼(我在其中保留了最少代碼)給了我一個錯誤。

為什么這樣做? 如果我想盡可能少地保留在 try/except 塊中,我應該怎么做? 任何線索將不勝感激。 我保留最少代碼行的第二個代碼的替代正確解決方案是什么? - 我應該對其進行哪些調整才能為我工作? 請幫忙。

NameError: name 'fahr' is not defined
***# Following Code Working Properly:***
inp = input('Enter Fahrenheit Temperature:')
try:
    fahr = float(inp)
    cel = (fahr - 32.0) * 5.0 / 9.0
    print(cel)
except:
    print('Please enter a number')
***# Following Code Not Working Properly:***
inp = input('Enter Fahrenheit Temperature:')

try:
    fahr = float(inp)
except:
    print('Please enter a number')

fahr = float(inp) # Even if I comment it, it doesn't make any difference when it comes to entering float in an input but it raises red flag if I enter string.
cel = (fahr - 32.0) * 5.0 / 9.0
print(cel)

try 表達式中的 less 是可取的

您輸入try:塊的代碼最好只包含可能直接產生相關錯誤的位。 通過這種方式,可以更輕松地跟蹤其源代碼,並且不會被周圍的任何可能安全的代碼分散注意力。

在這樣做時,請考慮控制流

第一段代碼運行正確,因為當第 4 行出現錯誤時,控制流直接跳轉到except塊,因此任何依賴fahr變量的語句都不會受到影響。 但是,在第二個片段中,如果引發錯誤並且控制流跳轉到 except 塊,則不會定義fahr變量,從而使依賴它的后續語句引發您所說的NameError錯誤。 一種更安全的方法是定義一個替代的默認fahr = 0 ,例如在except塊中或使用else:塊,如果try:塊中沒有引發錯誤,則控制流跳轉到該塊。

使您的錯誤處理具體化

始終嘗試使您預期的錯誤可能在您的代碼中明確提出。 這是通過將錯誤組的基本 class 放在except關鍵字之后和冒號之前。 例如,

except ValueError:

首先,不要使用通用的 catch 子句。 這將被視為不好的做法。

在您的情況下,如果用戶在示例中輸入字母而不是數字,則捕獲ValueErrors是有意義的:

while True:
    inp = input('Enter Fahrenheit Temperature:')
    try:
        fahr = float(inp)
        break # Break loop to get to main program
    except ValueError:
        print('Please enter a number')

fahr = float(inp) # Even if I comment it, it doesn't make any difference when it comes to entering float in an input but it raises red flag if I enter string.
cel = (fahr - 32.0) * 5.0 / 9.0
print(cel)

如果您真的想避免循環,另一種選擇是遞歸輸入:

def force_input(prompt):
    inp = input(prompt)
    try:
        fahr = float(inp)
        return fahr
    except ValueError:
        print('Please enter a number')
        force_input(prompt)
        return False

fahr = force_input("Enter Fahrenheit Temperature:")
cel = (fahr - 32.0) * 5.0 / 9.0
print(cel)

您的第一組代碼很好,但它不能從錯誤中恢復。 如果您希望程序優雅地恢復並再次請求輸入,則需要不斷循環輸入並嘗試直到它通過,就像這樣。

while True:
    inp = input('Enter Fahrenheit Temperature:')
    try:
        fahr = float(inp)
        break
    except:
        print('Please enter a number')

fahr = float(inp) # Even if I comment it, it doesn't make any difference when it comes to entering float in an input but it raises red flag if I enter string.
cel = (fahr - 32.0) * 5.0 / 9.0
print(cel)

您的問題很簡單: try: except:不是循環。

try:
    fahr = float(inp)
except:
    print('Please enter a number')

在這里,您嘗試設置 fahr,如果失敗,則打印“請輸入數字”,然后程序繼續。

但它未能設置 fahr,所以在下一行,當您嘗試使用 fahr 運行計算時。 它不存在,因此NameError: name 'fahr' is not defined

為什么會這樣:

inp = input('Enter Fahrenheit Temperature:')
try:
    fahr = float(inp)
    cel = (fahr - 32.0) * 5.0 / 9.0
    print(cel)
except:
    print('Please enter a number')

在這里,您嘗試設置 fahr,運行計算,打印。 但是,如果這些步驟中的任何一個失敗,您將打印錯誤並繼續。

看到不同? 我希望它有所幫助。

暫無
暫無

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

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