Программирование на языке Python
Программирование на языке Python
Исключения
Исключения
Исключения
Исключения
Исключения
Исключения
Исключения
Исключения
Исключения
Исключения
Конструкция try - except
Конструкция try - except
Конструкция try - except
Конструкция try - except
Конструкция try - except
Конструкция try - except
Исключения
Блок finally
Исключения
Получение информации об исключении
Генерация исключений
Генерация исключений
325.00K
Category: programmingprogramming

Исключения в Python (лекция 13)

1. Программирование на языке Python

Лекция 13. Исключения в Python
Заманова С.К.

2. Программирование на языке Python

2
Программирование
на языке Python
Конструкция try - except для
обработки исключений
К.Ю. Поляков, Е.А. Ерёмин, 2013
http://kpolyakov.spb.ru

3. Исключения

3
Исключения
При программировании на Python мы можем столкнуться
с двумя типами ошибок:
1. синтаксические ошибки (syntax error). Они появляются
в результате нарушения синтаксиса языка программирования при написании исходного кода. При наличии таких
ошибок программа не может быть скомпилирована. При
работе в какой-либо среде разработки, например, в
PyCharm, IDE сама может отслеживать синтаксические
ошибки и каким-либо образом их выделять.
2. ошибки выполнения (runtime error). Они появляются в
уже скомпилированной программе в процессе ее выполнения.
Подобные ошибки еще называются исключениями.

4. Исключения

4
Исключения
Исключения (exceptions) - ещё один тип данных в
Python.
Исключения необходимы для того, чтобы сообщать
программисту об ошибках.
Самый простейший пример исключения - деление на
ноль:
>>> 100 / 0
Traceback (most recent call last):
File "", line 1, in
100 / 0
ZeroDivisionError: division by zero
В данном случае интерпретатор сообщил нам об исключении ZeroDivisionError, то есть делении на ноль.

5. Исключения

5
Исключения
Например, при преобразовании числа в строку:
string = "5"
number = int(string)
print(number)
Данный скрипт успешно скомпилируется и выполнится,
так как строка "5" вполне может быть конвертирована в
число. Однако возьмем другой пример:
string = "hello"
number = int(string)
print(number)
При выполнении этого скрипта будет выброшено исключение ValueError, так как строку "hello" нельзя преобразовать в число. С одной стороны, очевидно, что строка не
представляет число, но мы можем иметь дело с вводом
пользователя, который также может ввести не совсем то,
что мы ожидаем:

6. Исключения

6
Исключения
string = input("Введите число: ")
number = int(string)
print(number)
Также возможны и другие исключения:
>>> 2 + '1'
Traceback (most recent call last):
File "", line 1, in 2 + '1'
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> int('qwerty')
Traceback (most recent call last):
File "", line 1, in int('qwerty')
ValueError: invalid literal for int() with base 10: 'qwerty'
В этих двух примерах генерируются исключения TypeError
и ValueError соответственно.
Подсказки дают нам полную информацию о том, где
порождено исключение, и с чем оно связано.

7. Исключения

7
Исключения
Рассмотрим иерархию встроенных в Рython исключений,
хотя иногда вам могут встретиться и другие, так как
программисты могут создавать собственные исключения.
Данный список актуален для Рython 3.3, в более ранних
версиях есть незначительные изменения.
• BaseException - базовое исключение, от которого берут
начало все остальные.
– SystemExit - исключение, порождаемое функцией
sys.exit при выходе из программы.
– KeyboardInterrupt - порождается при прерывании программы пользователем (обычно сочетанием клавиш Ctrl+C).
– GeneratorExit - порождается при вызове метода close
объекта generator.
– Exception - а вот тут уже заканчиваются полностью
системные исключения (которые лучше не трогать) и
начинаются обыкновенные, с которыми можно работать.

8. Исключения

8
Исключения
* StopIteration - порождается встроенной функцией next,
если в итераторе больше нет элементов.
* ArithmeticError - арифметическая ошибка.
· FloatingPointError - порождается при неудачном выполнении операции с плавающей запятой. На практике
встречается нечасто.
· OverflowError - возникает, когда результат арифметической операции слишком велик для представления. Не
появляется при обычной работе с целыми числами (так как
Python поддерживает длинные числа), но может возникать
в некоторых других случаях.
· ZeroDivisionError - деление на ноль.
* AssertionError - выражение в функции assert ложно.
* AttributeError - объект не имеет данного атрибута
(значения или метода).

9. Исключения

9
Исключения
* BufferError - операция, связанная с буфером, не может
быть выполнена.
* EOFError - функция наткнулась на конец файла и не
смогла прочитать то, что хотела.
* ImportError - не удалось импортирование модуля или его
атрибута.
* LookupError - некорректный индекс или ключ.
· IndexError - индекс не входит в диапазон элементов.
· KeyError - несуществующий ключ (в словаре,
множестве или другом объекте).
* MemoryError - недостаточно памяти.
* NameError - не найдено переменной с таким именем.
· UnboundLocalError - сделана ссылка на локальную
переменную в функции, но переменная не определена
ранее.

10. Исключения

10
Исключения
* OSError - ошибка, связанная с системой.
· BlockingIOError
· ChildProcessError - неудача при операции с дочерним
процессом.
· ConnectionError - базовый класс для исключений, связанных с подключениями.
· BrokenPipeError
· ConnectionAbortedError
· ConnectionRefusedError
· ConnectionResetError
· FileExistsError - попытка создания файла или директории, которая уже существует.
· FileNotFoundError - файл или директория не существует.
· InterruptedError - системный вызов прерван входящим
сигналом.
· IsADirectoryError - ожидался файл, но это директория.

11. Исключения

11
Исключения
· NotADirectoryError - ожидалась директория, но это файл.
· PermissionError - не хватает прав доступа.
· ProcessLookupError - указанного процесса не
существует.
· TimeoutError - закончилось время ожидания.
* ReferenceError - попытка доступа к атрибуту со слабой
ссылкой.
* RuntimeError - возникает, когда исключение не попадает
ни под одну из других категорий.
* NotImplementedError - возникает, когда абстрактные
методы класса требуют переопределения в дочерних
классах.
* SyntaxError - синтаксическая ошибка.
· IndentationError - неправильные отступы.
· TabError - смешивание в отступах табуляции и пробелов.

12. Исключения

12
Исключения
* SystemError - внутренняя ошибка.
* TypeError - операция применена к объекту
несоответствующего типа.
* ValueError - функция получает аргумент правильного
типа, но некорректного значения.
* UnicodeError - ошибка, связанная с кодированием /
раскодированием unicode в строках.
· UnicodeEncodeError - исключение, связанное с
кодированием unicode.
· UnicodeDecodeError - исключение, связанное с
декодированием unicode.
· UnicodeTranslateError - исключение, связанное с
переводом unicode.
* Warning - предупреждение.
Теперь, зная, когда и при каких обстоятельствах могут
возникнуть исключения, мы можем их обрабатывать.

13. Конструкция try - except

13
Конструкция try - except
При возникновении исключения работа программы прерывается, и чтобы избежать подобного поведения и обрабатывать исключения в Python есть конструкция try..except,
которая имеет следующее формальное определение:
try:
инструкции
except [Тип_исключения]:
инструкции
Весь основной код, в котором может возникнуть исключение, помещается после ключевого слова try. Если в этом
коде генерируется исключение, то работа кода в блоке try
прерывается, и выполнение переходит в блок except.
После ключевого слова except можно указать, какое исключение будет обрабатываться (ValueError или KeyError).
После слова except на следующей строке идут инструкции
блока except, выполняемые при возникновении исключения.

14. Конструкция try - except

14
Конструкция try - except
Рассмотрим обработку исключения на примере
преобразовании строки в число:
try:
number = int(input("Введите число: "))
print("Введенное число:", number)
except:
print("Преобразование прошло неудачно")
print("Завершение программы")
Вводим строку:
Введите число: hello
Преобразование прошло неудачно
Завершение программы
Как видно из консольного вывода, при вводе строки вывод
числа на консоль не происходит, а выполнение программы
переходит к блоку except.

15. Конструкция try - except

15
Конструкция try - except
Вводим правильное число:
Введите число: 22
Введенное число: 22
Завершение программы
Теперь все выполняется нормально, исключение не возникает, и соответственно блок except не выполняется.
В примере обрабатывались сразу все исключения, которые
могут возникнуть в коде. Но мы можем конкретизировать
тип обрабатываемого исключения, указав его после слова
except:
try:
number = int(input("Введите число: "))
print("Введенное число:", number)
except ValueError:
print("Преобразование прошло неудачно")
print("Завершение программы")

16. Конструкция try - except

16
Конструкция try - except
Если ситуация такова, что в программе могут быть сгенерированы различные типы исключений, то мы можем их
обработать по отдельности, используя дополнительные
выражения except:
try:
number1 = int(input("Введите первое число: "))
number2 = int(input("Введите второе число: "))
print("Результат деления:", number1/number2)
except ValueError:
print("Преобразование прошло неудачно")
except ZeroDivisionError:
print("Попытка деления числа на ноль")
except Exception:
print("Общее исключение")
print("Завершение программы")

17. Конструкция try - except

17
Конструкция try - except
Если возникнет исключение в результате преобразования
строки в число, то оно будет обработано блоком except
ValueError. Если же второе число будет равно нулю, то
есть будет деление на ноль, тогда возникнет исключение
ZeroDivisionError, и оно будет обработано блоком except
ZeroDivisionError.
Тип Exception представляет общее исключение, под
которое попадают все исключительные ситуации. Поэтому
в данном случае любое исключение, которое не
представляет тип ValueError или ZeroDivisionError, будет
обработано в блоке except Exception:.

18. Конструкция try - except

18
Конструкция try - except
В блоке try мы выполняем инструкцию, которая может
породить исключение, а в блоке except мы перехватываем
их. При этом перехватываются как само исключение, так и
его потомки.
Например, перехватывая ArithmeticError, мы также
перехватываем FloatingPointError, OverflowError и
ZeroDivisionError.
>>> try:
... k = 1 / 0
... except ArithmeticError:
... k = 0
...
>>> print(k)
0

19. Исключения

19
Исключения
• Также возможна инструкция except без аргументов,
которая перехватывает вообще всё (и прерывание с
клавиатуры, и системный выход и т. д.).
Поэтому в такой форме инструкция except практически не
используется, а используется except Exception.
Однако чаще всего перехватывают исключения по одному,
для упрощения отладки (вдруг вы ещё другую ошибку
сделаете, а except её перехватит).
• Ещё две инструкции, относящиеся к нашей проблеме,
это finally и else.
• Finally выполняет блок инструкций в любом случае,
было ли исключение, или нет (применима, когда нужно
непременно что-то сделать, к примеру, закрыть файл).
• Инструкция else выполняется в том случае, если
исключения не было.

20. Блок finally

20
Блок finally
При обработке исключений также можно использовать необязательный блок finally. Отличительной особенностью
этого блока является то, что он выполняется вне зависимости, было ли сгенерировано исключение:
try:
number = int(input("Введите число: "))
print("Введенное число:", number)
except ValueError:
print("Не удалось преобразовать число")
finally:
print("Блок try завершил выполнение")
print("Завершение программы")
Как правило, блок finally применяется для освобождения
используемых ресурсов, например, для закрытия файлов.

21. Исключения

21
Исключения
>>> f = open('1.txt')
>>> int s = []
>>> try:
... for line in f:
... int s.append(int(line))
... except ValueError:
... print('Это не число. Выходим.')
... except Exception:
... print('Это что ещё такое?')
... else:
... print('Всё хорошо.')
... finally:
... f.close()
... print('Я закрыл файл.')
... # Именно в таком порядке: try, группа except, затем else,
и только потом ˓→finally. ... Это не число. Я закрыл файл.

22. Получение информации об исключении

22
Получение информации об исключении
С помощью оператора as мы можем передать всю информацию об исключении в переменную, которую затем можно использовать в блоке except:
try:
number = int(input("Введите число: "))
print("Введенное число:", number)
except ValueError as e:
print("Сведения об исключении", e)
print("Завершение программы")
Пример некорректного ввода:
Введите число: fdsf
Сведения об исключении invalid literal for int() with base 10:
'fdsf'
Завершение программы

23. Генерация исключений

23
Генерация исключений
Иногда возникает необходимость вручную сгенерировать то
или иное исключение. Для этого применяется оператор
raise.
try:
number1 = int(input("Введите первое число: "))
number2 = int(input("Введите второе число: "))
if number2 == 0:
raise Exception("Второе число не должно быть равно 0")
print("Результат деления двух чисел:", number1/number2)
except ValueError:
print("Введены некорректные данные")
except Exception as e:
print(e)
print("Завершение программы")

24. Генерация исключений

24
Генерация исключений
При вызове исключения мы можем ему передать
сообщение, которое затем можно вывести пользователю:
Введите первое число: 1
Введите второе число: 0
Второе число не должно быть равно 0
Завершение программы
English     Русский Rules