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

Инструкции: Напишите функцию 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) 

2 Solutions collect form web for “Что я сделал неправильно в своей функции, связанной с привлечением исключения?”

Строка № 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 – ошибки и исключения

  • Повторно назначить исключение из блока python __exit__
  • Регистрация запрещенных исключений в Python
  • Каковы некоторые изящные способы абстрагирования повторяющейся обработки исключений в python?
  • Python try / except: Показывать причину ошибки после отображения моих переменных
  • Python try-else
  • Почему я не могу получить исключение Queue.Empty из очереди многопроцессорности?
  • Краткая обработка исключений в Python
  • Python: не удается поймать IndexError
  •  
    Interesting Posts for Van-Lav

    Как я могу использовать веб-службу WSDL (SOAP) в Python?

    Запись GeoDataFrame в базу данных SQL

    Как установить PyGI (Python Gobject Introspection) в Windows?

    Предел верхней памяти?

    Как установить pip3 на мой Mac?

    Предотвращение вложенности секций в Python Sphinx при использовании toctree

    Как проверить, какие тесты выполнялись во время команды управления командой manage.py Django

    Библиотека подгонки кривой Python, которая позволяет мне назначать границы параметрам

    sympy зависает при попытке решить простое алгебраическое уравнение

    Может ли python setup.py устанавливать диски?

    В окне фигуры matplotlib (с imshow), как я могу удалить, скрыть или переопределить отображаемую позицию мыши?

    Проблемы с получением триграмм с использованием Gensim

    Как использовать BeautifulSoup для получения глубоко вложенных значений div?

    (Python 3) Как передать двоичный файл как текст без сохранения первого

    как построить .exe для python 3.5+, 3.6 если возможно?

    Python - лучший язык программирования в мире.