[英]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.