Исключительные ситуации

Исключения — универсальный способ обработки ситуаций, по которым нельзя принять решения в текущем контексте.

Примеры исключений:

В 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

Пример

Задача: подсчёт частного двух вводимых чисел с обработкой исключений.

Анализ: можно выделить два вида исключительных ситуаций:

Пример решения:

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."

Ссылки

LecturesVMSH/Exceptions (последним исправлял пользователь eSyr 2009-04-29 19:58:24)