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

问题描述 投票:0回答:3

当用户输入的选项不在我的 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 来完成此操作。

python exception try-catch
3个回答
8
投票

我不确定你为什么要把检查放在异常处理程序中。修复它:

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
拼写错误。


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.")

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


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()
© www.soinside.com 2019 - 2024. All rights reserved.