【问题标题】:exception handling with try/except in python 2.7在 python 2.7 中使用 try/except 处理异常
【发布时间】:2012-07-20 03:58:38
【问题描述】:

我正在尝试异常处理/错误捕获,想知道为什么下面的代码不起作用。我正在使用python 2.7。我了解input()raw_input() 之间的区别,并且了解raw_input() 在Python 3.0 中已重命名为input()。如果我输入一个整数,那么代码会一直循环,直到我输入一个字符串。输入字符串时,我收到以下错误消息。有没有办法解决这个问题,或者这只是那些 python 怪癖之一?

  File "<some_directory_path_goes_here>", line 30, in <module>
    enterAge = input('Enter your age as an integer: ')
  File "<string>", line 1, in <module>
NameError: name '<user_entered_string_goes_here>' is not defined

在 python 2.7 中,在我看来代码应该仍然可以工作。

from types import IntType
age = 0
while True:
    enterAge = input('Enter your age as an integer: ')
    try:
        if type(enterAge) is IntType:
            num = enterAge
            age = age + num
            print str(age) + ' is old!'

    except TypeError:
        print 'You did\'t enter an integer'
        break

【问题讨论】:

    标签: types input error-handling python-2.7 try-except


    【解决方案1】:

    try-except 背后的想法是您没有事先检查所有必要条件。在您的情况下,您不需要检查 try 中的类型。由于if 语句,异常不会在应该引发的时候引发。

    另外,您绝对应该在 Python 2 上使用 raw_input(),并记住它总是返回 strint(enterAge) 的结果可能不同:

    In [1]: int('4')
    Out[1]: 4
    
    In [2]: int('4f')
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    /home/lev/<ipython-input-2-523c771e7a8e> in <module>()
    ----> 1 int('4f')
    
    ValueError: invalid literal for int() with base 10: '4f'
    

    这是您需要在 try 块中尝试并捕获 ValueError 的内容。

    编辑:显然我需要稍微澄清一下答案,所以我将展示我认为代码的外观:

    age = 0
    while True:
        enterAge = raw_input('Enter your age as an integer: ')
        try:
            age += int(enterAge)
            print age, 'is old!'
    
        except ValueError:
            print "You didn't enter an integer"
            break
    

    【讨论】:

    • "由于 if 语句,异常不会在应该引发的时候引发。"我不同意基于以下代码,在橙汁上引发异常fridge = {'eggs': 8, 'cheese': 12, 'butter': 4, 'milk': 17}try:if fridge['milk'] &gt; 0:print 'Drink some milk'except KeyError as error:print 'There is no %s' % errorprint 'There is no %s' % errortry:try:if fridge['orange juice'] &gt; 0:print 'Drink some orange juice'@98765432@except KeyError as error:987654341@944 '我没有让换行符工作吗?
    • @MichaelSwartz 在这种情况下,在if 内部评估条件时会导致异常:fridge['orange juice'] &gt; 0 本身会导致异常,因此这是try 的正确用法。但是在问题中,可能的问题是错误的类型,所以try 可以解决这个问题,但if 检查同样的事情。 type(enterAge) is IntType 不能产生异常,这就是区别。是的,你不能在 cmets 中有换行符。有时这很令人沮丧。不过,您可以根据答案和 cmets 编辑您的问题。
    • 所以我的代码是错误的,因为 ("x" * 100) is ("x" * 100)False("x" * 100) == ("x" * 100)True 因为 is 测试身份而不是相等?
    • 不确定在上下文中使用is(它可能有效,正如一个简单的测试所示),但我的意思是你的代码是错误的,你放了一个 exception- try 块中的安全 段代码。您使用if 使其安全。您应该在问题中显示的代码中使用iftry。正如我之前提到的,您犯的另一个错误是raw_input 返回的用户输入将始终为str,除非您明确转换它,因此您需要考虑这一点。
    • @MichaelSwartz 我编辑了答案,希望对您有所帮助。随时问。
    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多