本教程提出异常。我弄清楚了吗?

时间:2015-08-30 11:58:08

标签: 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.

"""
# your code here
    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 x == 'sub' or x == 'mul' or x == 'div'
            output.append(x)
        except ValueError:
            raise InvalidCommand(ValueError)
    for x in strdigits:
        try:
            float(x)
            floats.append(float(x))
        except ValueError:
             raise InvalidCommand(ValueError)
    output.append(floats)
    return tuple(output)

当我在它应该引发InvalidCommand()的值上测试它时,它告诉我“你的代码必须引发InvalidCommand()。但是我的代码确实。我检查了错别字而且没有。所以我整个提升声明是否错误?请告诉我如何解决这个问题。谢谢。

3 个答案:

答案 0 :(得分:1)

这一行:

x == 'add' or x == 'sub' or x == 'mul' or x == 'div'

什么都不做。它实际上并没有对您的测试结果做任何事情,当然它不会引发ValueError

你需要的是这样的东西:

if x.lower in ('add', 'sub', 'mul', 'div'):
    output.append(x)
else:
    raise InvalidCommand('unknown command: {}'.format(x))

您的代码适用于数字参数,因为float()如果给出了一个无法转换为float的字符串,则可以引发ValueError

>>> float('abcd')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: abcd

另外,为什么要将ValueError作为参数传递给自定义异常?您可能希望传递一个描述错误性质的错误字符串,例如

raise(InvalidCommand('arguments must be numeric: {}'.format(x))

或者,您可以窃听ValueError的消息:

    try:
        float(x)
        floats.append(float(x))
    except ValueError as exc:
         raise InvalidCommand(exc)

答案 1 :(得分:0)

你使这种方式变得比它需要的更复杂。

class InvalidCommand(Exception):
    pass

def validate_input(datastr):
    """
    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 = datastr.split()
    if len(inlist) != 3:
        raise InvalidCommand('Bad command length: ' + str(len(inlist)))

    x = inlist[0]
    if x in ('add', 'sub', 'mul', 'div'):
        cmd = x
    else:
        raise InvalidCommand('Bad command verb: ' + x)

    floats = []
    for x in inlist[1:]:
        try:
            floats.append(float(x))
        except ValueError:
             raise InvalidCommand('Bad command arg: ' + x)

    return cmd, floats

#Test

data = [
    'add 1 2',
    'sub 3.0 2.0',
    'mul 4.5 1.5',
    'div 8 4',
    'add 1 2 3',
    'fred 2 3',
    'add a b',
    'sub 1 c',
]

for s in data:
    try:
        print(validate_input(s))
    except InvalidCommand as e:
        print(repr(s), e)

<强>输出

('add', [1.0, 2.0])
('sub', [3.0, 2.0])
('mul', [4.5, 1.5])
('div', [8.0, 4.0])
'add 1 2 3' Bad command length: 4
'fred 2 3' Bad command verb: fred
'add a b' Bad command arg: a
'sub 1 c' Bad command arg: c

我已经更改了validate_input函数的参数,因为string是标准Python模块的名称,因此将它用于简单的变量名称会让人感到困惑。如果你想使用那个模块,那么像这样遮蔽它的名字可能会导致恼人的错误。

答案 2 :(得分:0)

我为我的单科csse1001做了同样的问题。我做的是这个:

# your code here
lst = string.split(' ')
commands = ['add', 'sub', 'mul', 'div']
if lst[0] not in commands:
    raise InvalidCommand()
if len(lst) != 3:
    raise InvalidCommand()
try:
    arg1 = float(lst[1])
    arg2 = float(lst[2])
    return(lst[0], [arg1, arg2])
except ValueError:
    raise InvalidCommand()

这对我有用。