Что я сделал неправильно в своей функции, связанной с привлечением исключения?

Инструкции: Напишите функцию validate_input (string), которая принимает командную строку в формате 'command arg1 arg2' и возвращает пару ('command', [arg1, arg2]), где arg1 и arg2 были преобразованы в float. Если команда не является частью «add», «sub», «mul» или «div», она должна поднять InvalidCommand. Если аргументы не могут быть преобразованы в float, он должен поднять InvalidCommand.

Типичные входы и выходы:

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

validate_input ('hahahaha 2 3') -> Raises InvalidCommand ()

validate_input ('add six 3') -> Raises 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 xy sub xy mul xy div xy 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) 

Строка № 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) с 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.

 >>> 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 .

Как предложил Павел в комментариях, используйте raise Exception чтобы вызвать исключение.

Есть несколько ошибок, поэтому я затрону вопрос в заголовке: какие ошибки возникают при создании исключения?

Чтобы создать исключение, используйте 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 – ошибки и исключения