繁体   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