В последней статье , мы рассмотрели, что такое модули и как с ними работать, теперь же перейдем к обработке исключений.
Что такое исключения? Исключения это тип данных, который кстати говоря мы не рассматривали. Зачем он нужен, этот тип? Ну, разработчики python придумали его, чтобы мы знали о своих ошибках в коде.
Чему мы научимся в рамках этой статьи? Ну например, мы сделаем так, чтобы при делении на ноль, не выкидывало из программы, а просто выводило "Делить на ноль нельзя".
Вызовем любую ошибку в python и попытаемся ее проанализировать:
Сначала нам говорят, что интерпритатор нашел исключение(Traceback (most recent call last) )
File "<stdin>", line 1, in <module> - тут нам говорят где исключение. Вместо <stdin> может быть имя файла, но у меня <stdin>, ибо писал все это просто в консоль питона. Далее нам говорят, что ошибка вызвавшая исключение находится в первой строке.
TypeError: ... - тут нам говорят тип ошибки TypeError и пояснение, что мы к строке число прибавляем.
Давайте для начала я опишу, какие исключения мы можем обрабатывать:
- StopIteration - порождается встроенной функцией next, если в итераторе больше нет элементов.
- ArithmeticError - арифметическая ошибка.
- FloatingPointError - порождается при неудачном выполнении операции с плавающей запятой.
- OverflowError - возникает, когда результат арифметической операции слишком велик для представления. Не появляется при обычной работе с целыми числами (так как python поддерживает длинные числа), но может возникать в некоторых других случаях.
- ZeroDivisionError - деление на ноль.
- AssertionError - выражение в функции assert ложно.
- AttributeError - объект не имеет данного атрибута (значения или метода).
- BufferError - операция, связанная с буфером, не может быть выполнена.
- EOFError - функция наткнулась на конец файла и не смогла прочитать то, что хотела.
- ImportError - не удалось импортирование модуля или его атрибута.
- LookupError - некорректный индекс или ключ.
- IndexError - индекс не входит в диапазон элементов.
- KeyError - несуществующий ключ (в словаре, множестве или другом объекте).
- MemoryError - недостаточно памяти.
- NameError - не найдено переменной с таким именем.
- UnboundLocalError - сделана ссылка на локальную переменную в функции, но переменная не определена ранее.
- OSError - ошибка, связанная с системой.BlockingIOError
- ChildProcessError - неудача при операции с дочерним процессом.
- ConnectionError - базовый класс для исключений, связанных с подключениями.
- FileExistsError - попытка создания файла или директории, которая уже существует.
- FileNotFoundError - файл или директория не существует.
- InterruptedError - системный вызов прерван входящим сигналом.
- IsADirectoryError - ожидался файл, но это директория.
- NotADirectoryError - ожидалась директория, но это файл.
- PermissionError - не хватает прав доступа.
- ProcessLookupError - указанного процесса не существует.
- TimeoutError - закончилось время ожидания.
- ReferenceError - попытка доступа к атрибуту со слабой ссылкой.
- RuntimeError - возникает, когда исключение не попадает ни под одну из других категорий.
- NotImplementedError - возникает, когда абстрактные методы класса требуют переопределения в дочерних классах.
- SyntaxError - синтаксическая ошибка.
- IndentationError - неправильные отступы.
- TabError - смешивание в отступах табуляции и пробелов.
- SystemError - внутренняя ошибка.
- TypeError - операция применена к объекту несоответствующего типа.
- ValueError - функция получает аргумент правильного типа, но некорректного значения.
- UnicodeError - ошибка, связанная с кодированием / раскодированием unicode в строках.
Рассмотрим же синтаксис обработки исключений:
И так, обязательны в этом всем только try и except, остальное может и отсутствовать, более того мы даже можем не указать конкретную ошибку, а перехватывать все возможные, или указать несколько.
Давайте напишем простой код, который в случае сложения строки и числа, будет выводить их сумму:
Как мы видим, мы вводим строку а и число b, после чего их без проблем складываем.
Ну вот, как то так работает обработка исключений в Python.