[英]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:
塊的代碼最好只包含可能直接產生相關錯誤的位。 通過這種方式,可以更輕松地跟蹤其源代碼,並且不會被周圍的任何可能安全的代碼分散注意力。
第一段代碼運行正確,因為當第 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.