我正在尝试尝试并提出异常,因为我还没有完全掌握如何正确使用它们。
当用户输入的选项不在我指定的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来执行此操作。
感谢
答案 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()