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") |
顺便说一下,内置
1 | raise ValueError("Please enter one of the 3 choices 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() |