Исключительные ситуации
Исключения — универсальный способ обработки ситуаций, по которым нельзя принять решения в текущем контексте.
Примеры исключений:
Приведение типов (int('ss') — ValueError)
Арифметические операции (1/0 — ZeroDivisionError)
Файловые операции (open('nonexistent') — IOError)
- ...
В Python стандартные типы исключений определены в модуле exceptions. Тем не менее, нет необходимости подключать его явно.
Исключения возникают в контексте их возбуждения и проваливаются по стеку вызовов, пока их не обработают. Если исключение проваливается до дна стека вызовов, то происходит аварийное завершение приложения с выводом информации об исключении.
Обработка исключений
try: ... except: ...
Для обработки отдельных исключений в клаузе except можно указать его тип или tuple типов:
try: ... except ExceptionType: ...
try: ... except (ExceptionType1, ExceptionType2): ...
Можно указывать несколько блоков except:
try: ... except ExceptionType1: ... except ExceptionType2: ...
Для получения доступа к информации об исключении внутри блока except его можно объявить:
try: ... except ExceptionType as ExceptionInstance: ...
Среди атрибутов экземпляра исключения можно отметить атрибут args.
Примечание: для получения информации об исключительной ситуации можно исопльзовать sys.exc_info(). Она возвращает tuple из трёх элементов с информацией об исключении.
Можно использовать блок else для обработки ситуации в случае, если ни один блок except не отработал:
try: ... except ExceptionType: ... else: ...
Для выполнения завершающих операций, выполняющихся вне зависимости от успешности блока try, (например, очистки ресурсов) можно использовать блок finally. Его операции выполняются также в случае, если внутри блока try был вызван break.
try: ... finally: ...
Возбуждение исключений
Для возбуждения исключений используется оператор raise:
raise ExceptionType(ExceptionParams)
Для повторного возбуждения исключения во время его обработки используется оператор raise без параметров:
try: ... except: raise
Пример
Задача: подсчёт частного двух вводимых чисел с обработкой исключений.
Анализ: можно выделить два вида исключительных ситуаций:
Ошибка конвертации в int, возникающая при вводе не-числа (ValueError)
Ошибка деления на ноль (ZeroDivisionError)
Пример решения:
while True: try: a = int(raw_input("Enter first number: ")) b = int(raw_input("Enter second number: ")) break except ValueError: print "Invalid number. Try again." try: print str(a/b) except ZeroDivisionError: print "Division by zero."