[英]What did I do wrong in my function involving raising an exception?
说明:编写一个函数validate_input(string),该函数采用格式为'command arg1 arg2'的命令字符串,并返回该对('command',[arg1,arg2]),其中arg1和arg2已转换为浮点数。 如果该命令不是'add','sub','mul'或'div'之一,则它必须引发InvalidCommand。 如果参数不能转换为浮点数,则必须引发InvalidCommand。
典型的输入和输出:
validate_input('add 2 3')->('add'[2.,3.])
validate_input('hahahaha 2 3')->引发InvalidCommand()
validate_input('增加六个3')->引发InvalidCommand()
这是我的代码:
class InvalidCommand(Exception):
pass
def validate_input(string):
"""
validate_input(str) -> (str, [float])
If string is a valid command, return its name and arguments.
If string is not a valid command, raise InvalidCommand
Valid commands:
add x y
sub x y
mul x y
div x y
Arguments x and y must be convertable to float.
"""
inlist = string.split(' ')
commands = []
strdigits = []
floats = []
output = []
for x in inlist:
if x.isdigit():
strdigits.append(x)
else:
commands.append(x)
for x in commands:
try:
x == 'add' or 'sub' or 'mul' or 'div'
output.append(x)
except ValueError:
return InvalidCommand(ValueError)
for x in strdigits:
try:
float(x)
floats.append(float(x))
output.append(floats)
except ValueError:
return InvalidCommand(ValueError)
return tuple(output)
有多个错误,因此我将在标题中解决这个问题:引发异常的错误是什么?
要引发异常,请使用raise ExceptionType(parameter)
,而不要return
像这样:
class InvalidCommand(Exception):
pass
try:
s = raw_input("Enter a number:")
x = float(s)
except ValueError:
raise InvalidCommand(s+" is not a number")
请注意,始终需要在某个位置定义自定义异常类型。 由于InvalidCommand
是自定义的Exception类型(Python中未包含),因此在使用InvalidCommand
之前应为其定义类。 这个类定义可以放在python程序文件的顶部附近,只需要出现一次即可。
有关更多信息,请参见Python文档-错误和异常
第37行(用于循环),您是立即从floats
追加值,这导致它将float列表两次追加到output
变量。 对于输入mul 5 6
,它正在返回('mul', [5.0, 6.0], [5.0, 6.0])
,因此要做的第一件事是在循环后放置output.append(floats)
。
for x in strdigits:
try:
float(x)
floats.append(float(x))
except ValueError:
return InvalidCommand(ValueError)
output.append(floats)
其次,这是错误的做法,
x == 'add' or 'sub' or 'mul' or 'div'
从Python shell检查这些输出。
>>> x = 'fas'
>>> x == 'add' or 'sub' or 'mul' or 'div'
'sub'
>>> x in ['add','sub','mul','div']
False
>>> bool('sub')
True
我希望一切都清楚了,所以将您的状况更改为
if x in ['add','sub','mul','div']:
output.append(x)
else:
raise InvalidCommand(ValueError)
处理无效的command
值。
如Paul在评论中所建议,请使用raise Exception
引发异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.