我在涉及提出异常的函数中做错了什么?

时间:2015-08-30 07:20:20

标签: python exception-handling

说明 编写一个函数validate_input(string),它接受格式为'command arg1 arg2'的命令字符串并返回该对('command',[arg1,arg2]),其中arg1和arg2已转换为浮点数。如果命令不是'add','sub','mul'或'div'之一,则必须引发InvalidCommand。如果参数无法转换为浮点数,则必须引发InvalidCommand。

典型输入和输出:

validate_input('add 2 3') - > ('添加'[2.,3。])

validate_input('hahahaha 2 3') - >引发InvalidCommand()

validate_input('add six 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)

2 个答案:

答案 0 :(得分:1)

有多个错误,所以我将在标题中提出问题:提出异常有什么错误?

要提出例外,请使用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是自定义异常类型(不包含在Python中),因此在使用之前应该有InvalidCommand的类定义。这个类定义可以接近python程序文件的顶部,只需要出现一次。

有关详情,请参阅Python docs -- errors and exceptions

答案 1 :(得分:0)

第37行(for循环),您将立即从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来引发异常。