Ошибка ValueError в Python
Ошибка ValueError в Python возникает, когда функция получает аргумент правильного типа, но несоответствующее значение. Также не следует описывать ситуацию более точным исключением, например IndexError.
Пример
Вы получите ValueError с математическими операциями, такими как квадратный корень из отрицательного числа.
>>> import math >>> >>> math.sqrt(-10) Traceback (most recent call last): File "", line 1, in ValueError: math domain error >>>
Обработка исключения
Вот простой пример обработки исключения ValueError с помощью блока try-except.
import math x = int(input('Please enter a positive number:\n')) try: print(f'Square Root of is ') except ValueError as ve: print(f'You entered , which is not a positive number.')
Вот результат работы программы с разными типами ввода.
Please enter a positive number: 16 Square Root of 16 is 4.0 Please enter a positive number: -10 You entered -10, which is not a positive number. Please enter a positive number: abc Traceback (most recent call last): File "/Users/pankaj/Documents/PycharmProjects/hello-world/journaldev/errors/valueerror_examples.py", line 11, in x = int(input('Please enter a positive number:\n')) ValueError: invalid literal for int() with base 10: 'abc'
Наша программа может вызывать ValueError в функциях int() и math.sqrt(). Итак, мы можем создать вложенный блок try-except для обработки обоих. Вот обновленный фрагмент, который позаботится обо всех сценариях ValueError.
import math try: x = int(input('Please enter a positive number:\n')) try: print(f'Square Root of is ') except ValueError as ve: print(f'You entered , which is not a positive number.') except ValueError as ve: print('You are supposed to enter positive number.')
ValueError в функции
Вот простой пример, в котором мы поднимаем ValueError для входного аргумента правильного типа, но неподходящего значения.
import math def num_stats(x): if x is not int: raise TypeError('Work with Numbers Only') if x < 0: raise ValueError('Work with Positive Numbers Only') print(f'square is ') print(f' square root is ')
Исключения в python. Конструкция try - except для обработки исключений
Исключения (exceptions) - ещё один тип данных в python. Исключения необходимы для того, чтобы сообщать программисту об ошибках.
Самый простейший пример исключения - деление на ноль:
Разберём это сообщение подробнее: интерпретатор нам сообщает о том, что он поймал исключение и напечатал информацию (Traceback (most recent call last)).
Далее имя файла (File ""). Имя пустое, потому что мы находимся в интерактивном режиме, строка в файле (line 1);
Выражение, в котором произошла ошибка (100 / 0).
Название исключения (ZeroDivisionError) и краткое описание исключения (division by zero).
Разумеется, возможны и другие исключения:
В этих двух примерах генерируются исключения TypeError и ValueError соответственно. Подсказки дают нам полную информацию о том, где порождено исключение, и с чем оно связано.
Рассмотрим иерархию встроенных в python исключений, хотя иногда вам могут встретиться и другие, так как программисты могут создавать собственные исключения. Данный список актуален для python 3.3, в более ранних версиях есть незначительные изменения.
- BaseException - базовое исключение, от которого берут начало все остальные.
- SystemExit - исключение, порождаемое функцией sys.exit при выходе из программы.
- KeyboardInterrupt - порождается при прерывании программы пользователем (обычно сочетанием клавиш Ctrl+C).
- GeneratorExit - порождается при вызове метода close объекта generator.
- Exception - а вот тут уже заканчиваются полностью системные исключения (которые лучше не трогать) и начинаются обыкновенные, с которыми можно работать.
- StopIteration - порождается встроенной функцией next, если в итераторе больше нет элементов.
- ArithmeticError - арифметическая ошибка.
- FloatingPointError - порождается при неудачном выполнении операции с плавающей запятой. На практике встречается нечасто.
- OverflowError - возникает, когда результат арифметической операции слишком велик для представления. Не появляется при обычной работе с целыми числами (так как python поддерживает длинные числа), но может возникать в некоторых других случаях.
- ZeroDivisionError - деление на ноль.
- IndexError - индекс не входит в диапазон элементов.
- KeyError - несуществующий ключ (в словаре, множестве или другом объекте).
- UnboundLocalError - сделана ссылка на локальную переменную в функции, но переменная не определена ранее.
- BlockingIOError
- ChildProcessError - неудача при операции с дочерним процессом.
- ConnectionError - базовый класс для исключений, связанных с подключениями.
- BrokenPipeError
- ConnectionAbortedError
- ConnectionRefusedError
- ConnectionResetError
- IndentationError - неправильные отступы.
- TabError - смешивание в отступах табуляции и пробелов.
- UnicodeEncodeError - исключение, связанное с кодированием unicode.
- UnicodeDecodeError - исключение, связанное с декодированием unicode.
- UnicodeTranslateError - исключение, связанное с переводом unicode.
Теперь, зная, когда и при каких обстоятельствах могут возникнуть исключения, мы можем их обрабатывать. Для обработки исключений используется конструкция try - except.
Первый пример применения этой конструкции:
Ещё две инструкции, относящиеся к нашей проблеме, это finally и else. Finally выполняет блок инструкций в любом случае, было ли исключение, или нет (применима, когда нужно непременно что-то сделать, к примеру, закрыть файл). Инструкция else выполняется в том случае, если исключения не было.
Для вставки кода на Python в комментарий заключайте его в теги