【问题标题】:While Try Except in Python 3在 Python 3 中尝试时除外
【发布时间】:2018-07-04 12:46:22
【问题描述】:

我为此挣扎了几个小时,终于弄明白了。当然,现在对我来说似乎很痛苦,但也许有一天其他人会被困在同一个地方,所以我想我会问和回答。当然,欢迎任何更正或解释。

缩略代码:

bearNames = {
    'grizzly' : 'GZ',
    'brown' : 'BR',
}

bearAttributes = {
    'GZ' : 'huge and light brown',
    'BR' : 'medium and dark brown',
}

print("Type the name of a bear:")
userBear = input("Bear: ")

beartruth = True
while beartruth == True:

    try:
        print("Abbreviation is ", bearNames[userBear])
        print("Attributes are ", bearAttributes[bearNames[userBear]])
        print("beartruth: ", beartruth)
        beartruth = False
        print("beartruth: ", beartruth)

    except:
        print("Something went wrong - did you not type a bear name?")
        print("beartruth: ", beartruth)

问题 - 输入不是熊的东西会永远循环“例外”部分。我想要发生的事情应该是相当明显的 - 如果用户输入了不在 BearNames 中的内容,它应该触发异常,打印错误并返回尝试。

【问题讨论】:

  • 找出你的错误是什么,除了 [error that you have] 以便它真正捕捉到一些东西
  • 提示:您不会更改您的 except 中的任何内容,也不会到达beartruth = False 行。
  • input() 需要在循环内部
  • @fishkake 只有一个Error 是您希望这段代码抛出的,那就是KeyError。因此,如果提出了不同的问题,请让自己感到惊讶。很高兴知道。

标签: python python-3.x while-loop try-except


【解决方案1】:

因为您要求进行一些更正或解释。

来自您的代码

try:
    print("Abbreviation is ", bearNames[userBear])
    print("Attributes are ", bearAttributes[bearNames[userBear]])
    print("beartruth: ", beartruth)
    beartruth = False
    print("beartruth: ", beartruth)

except:
    print("Something went wrong - did you not type a bear name?")
    print("beartruth: ", beartruth)

您可以使用 Exceptions 来具体说明(我会推荐它),以确保隔离您可能预期的错误。

try:
    print("Abbreviation is ", bearNames[userBear])
except KeyError:
    print("Something went wrong - did you not type a bear name?")
    print("beartruth: ", beartruth)
else:
    print("Attributes are ", bearAttributes[bearNames[userBear]])
    print("beartruth: ", beartruth)
    beartruth = False
    print("beartruth: ", beartruth)

这样做,你就知道实际上不是一只。只有当 是真的熊时,你才能进入else 块做其他事情。

如果最后4行有错误,引发的异常会有所不同,不会被泛型隐藏

except:

block,这也会隐藏其他错误,但您会认为这是用户的错误输入。

因为您处于while 循环中,您也可以这样做:

try:
    print("Abbreviation is ", bearNames[userBear])
except KeyError:
    print("Something went wrong - did you not type a bear name?")
    print("beartruth: ", beartruth)
    continue  # go back to the beginning of the loop

# There was no error and continue wasn't hit, the Bear is a bear
print("Attributes are ", bearAttributes[bearNames[userBear]])
print("beartruth: ", beartruth)
beartruth = False
print("beartruth: ", beartruth)

【讨论】:

  • 我可能会说显而易见的,但这是在没有社区的情况下自行学习编码的问题。你学会了做某事的方法,但你没有学会做某事的 15 种方法,这些方法会导致最佳实践和更好的代码。我的代码有效。你的代码比我的好。结果,我的代码下次会更好。这就是我来这里的原因!我将您的帖子标记为“答案”,因为它确实包含我的答案,但它包含更多价值。
【解决方案2】:

我最终想出的答案是将 input() 放在 while 中。解释...

编写的代码首先要求用户输入,然后开始。如果用户输入'grizzly',则尝试成功,并且将 bearTruth 设置为 false,从而中断循环。 (也许 break 语句在这里可以起到作用,但我还没有达到 break 语句的程度 :))

如果用户输入的不是熊,则输入完成,然后开始尝试。它失败了,但我们已经在里面了,并且设置了用户输入。因此,尝试再次以相同的 userBear 值发生,再次失败,并永远循环。

也许有一天像我这样愚蠢的人会遇到这个问题并找到解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-07
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多