关于python:无法通过用户输入引发异常

Can't raise an exception with user input

我练习尝试并提出例外,因为我还没有完全掌握如何正确使用它们。

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

1
2
3
4
5
6
7
8
9
10
11
    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来做这个。

谢谢


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

1
2
3
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听起来像是一个逻辑异常选择:

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

并注意only only错字。


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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.")

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


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

1
2
3
4
5
6
7
8
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()