无法通过用户输入引发异常

时间:2016-01-26 06:05:58

标签: python exception-handling try-catch

我正在尝试尝试并提出异常,因为我还没有完全掌握如何正确使用它们。

当用户输入的选项不在我指定的3个选项中时,我想在这段代码中引发异常:

    inventory = []
    print "You can choose 2 items from the following:"
    print "Gun, Grenade, Smoke bomb. Type your weapon choices now: " 

    try:
        choice1 = raw_input("Choice 1:  ")
        inventory.append(choice1)

    except:
        if choice1 not in ('gun', 'grenade', 'smoke bomb'):
            raise Exception("Please enter one of the 3 choices only only")

然而,当我运行它时,用户的选择将被接受,无论他们输入什么,我不清楚原因。

我知道我可以通过其他方式进行此工作,例如在raw_input之后放置一个while循环来检查针对这3个项目输入的内容但是我想通过try和except来执行此操作。

感谢

3 个答案:

答案 0 :(得分:6)

我不确定你为什么要把你的支票放在异常处理程序中。解决它:

choice1 = raw_input("Choice 1:  ")
if choice1 not in ('gun', 'grenade', 'smoke bomb'):
    raise Exception("Please enter one of the 3 choices only only")

顺便说一句,内置ValueError听起来像是一个逻辑异常选择:

raise ValueError("Please enter one of the 3 choices only only")

请注意only only错字。

答案 1 :(得分:4)

像Python这样的错误处理的优点是错误可以在一个级别检测到,但由另一个级别处理。假设您有一个自定义输入函数,它试图验证输入并在出现问题时引发一个例外情况。在这里我们将使用自定义异常,但正如建议的那样使用像ValueError这样的内置异常也很好:

class BadChoiceError(Exception):

    def __str__(self):
        return "That choice not available!"

def get_choice(prompt):
    choice = raw_input(prompt)
    if choice not in {'gun', 'grenade', 'smoke bomb'}:
        raise BadChoiceError()
    return choice

inventory = []

print "You can choose 2 items from the following:"
print "Gun, Grenade, Smoke bomb. Type your weapon choices now: " 

try:
    choice1 = get_choice("Choice 1: ")

    inventory.append(choice1)

except BadChoiceError as error:
    print(str(error))
    print("Please enter one of the 3 choices only.")

except:
    exit("Unknown error.  Try again later.")

输入函数本身可以选择处理错误本身,但它允许更高级别的代码决定最佳处理方式 这种情况(或不是。)

答案 2 :(得分:0)

为此您可以制作自己的自定义异常 ... 创建一个继承Exception类的相应类尝试使用... s

来捕获它
class YourException(Exception):
    def __repr__(self):
        return 'invalid choice'
invent = []
try:
    c = raw_input("enter your choice :")
    if c not in ['dvdvdf','vfdv','fvdv']:#these are your choice
        raise YourException()