Базовый синтаксис исключений Python

try:
   # Действия, которые необходимо выполнить
   pass
except  (Exception1[, Exception2[,...ExceptionN]]]) as exc_obj:
   # Обработка указанных исключений
   # exc_obj содержит экземпляр исключения
   pass
else:
   # Блок вызывается в случае если в процессе выполнения не возбуждалось исключений. 
   pass
finally:
   # Блок выполняется всегда.
   pass

Несколько обработчиков исключений

try:
   # Действия, которые необходимо выполнить
   pass
except ValueError:
   # обработка исключения ValueError
   pass
except (TypeError, ZeroDivisionError):
   # Обработка нескольких исключений:
   # TypeError and ZeroDivisionError
   pass
except:
   # Обработка всех остальных типов исключений
   pass

Иерархия встроенных (built-in) исключений

BaseException
 +-- SystemExit
 +-- KeyboardInterrupt
 +-- GeneratorExit
 +-- Exception
      +-- StopIteration
      +-- StopAsyncIteration
      +-- ArithmeticError
      |    +-- FloatingPointError
      |    +-- OverflowError
      |    +-- ZeroDivisionError
      +-- AssertionError
      +-- AttributeError
      +-- BufferError
      +-- EOFError
      +-- ImportError
      |    +-- ModuleNotFoundError
      +-- LookupError
      |    +-- IndexError
      |    +-- KeyError
      +-- MemoryError
      +-- NameError
      |    +-- UnboundLocalError
      +-- OSError
      |    +-- BlockingIOError
      |    +-- ChildProcessError
      |    +-- ConnectionError
      |    |    +-- BrokenPipeError
      |    |    +-- ConnectionAbortedError
      |    |    +-- ConnectionRefusedError
      |    |    +-- ConnectionResetError
      |    +-- FileExistsError
      |    +-- FileNotFoundError
      |    +-- InterruptedError
      |    +-- IsADirectoryError
      |    +-- NotADirectoryError
      |    +-- PermissionError
      |    +-- ProcessLookupError
      |    +-- TimeoutError
      +-- ReferenceError
      +-- RuntimeError
      |    +-- NotImplementedError
      |    +-- RecursionError
      +-- SyntaxError
      |    +-- IndentationError
      |         +-- TabError
      +-- SystemError
      +-- TypeError
      +-- ValueError
      |    +-- UnicodeError
      |         +-- UnicodeDecodeError
      |         +-- UnicodeEncodeError
      |         +-- UnicodeTranslateError
      +-- Warning
           +-- DeprecationWarning
           +-- PendingDeprecationWarning
           +-- RuntimeWarning
           +-- SyntaxWarning
           +-- UserWarning
           +-- FutureWarning
           +-- ImportWarning
           +-- UnicodeWarning
           +-- BytesWarning
           +-- ResourceWarning

Code snippets


Примеры использования встроенных исключений


# Использование блока try-except, исключение возбуждается.
try:
  a = 1/0
except ZeroDivisionError:
  print("Было обработано исключение")
else:
  print("Исключений в процессе выполнения возбуждено не было")
finally:
  print("Должно выполниться в любом случае")
Было обработано исключение
Должно выполниться в любом случае

# Использование блока try-except, исключений возбуждено не было.
try:
  a = 1/5
except ZeroDivisionError:
  print("Было обработано исключение")
else:
  print("Исключений в процессе выполнения возбуждено не было")
finally:
  print("Должно выполниться в любом случае")
Исключений в процессе выполнения возбуждено не было
Должно выполниться в любом случае

Создание собственных исключений

Исключение в Python — класс, унаследованный от BaseException.

Для создания собственного исключения достаточно унаследовать его от любого built-in исключения в том месте иерархии, которая необходима.

Блок except ловит как исключение указанного класса, так и любого его наследника.


#Создание класса исключения.

class NetworkError(RuntimeError):
  pass


try:
  # Для возбуждения исключения необходимого типа используется инструкция raise.
  raise NetworkError("Exception text") 

except RuntimeError as e:
  print("Обработана RuntimeError:", e)

except NetworkError as e:
  print("Обработана NetworkError:", e)
Обработана RuntimeError: Exception text

Hint: при возбуждении исключения, выбирается первый подходящий обработчик.


# Здесь отработает хэндлер NetworkError.
class NetworkError(RuntimeError):
  pass


try:
  raise NetworkError("Exception text")

except NetworkError as e:
  print("Обработана NetworkError:", e)

except RuntimeError as e:
  print("Обработана RuntimeError:", e)
Обработана NetworkError: Exception text

Каскадная обработка исключений

Инструкция raise без параметров возбуждает последнее происзошедшее исключение. В случае, если она расположена в блоке except, ислючение будет поймано обработчиками более высокого порядка.


class NetworkError(RuntimeError):
   pass


try:
  try:
    # Для возбуждения исключения без передачи каких-либо параметров скобки.
    # не обязательны. Экземпляр будет создан в любом случае.
    raise NetworkError 
  except NetworkError as e:
    print('Первый обработчик, id исключения:', id(e))
    raise
except Exception as exc:
  print('Второй обработчик, id исключения:', id(exc))
Первый обработчик, id исключения: 140255202485536
Второй обработчик, id исключения: 140255202485536

# Вложенные блоки работают одинаково где бы они не находились.
class NetworkError(RuntimeError):
   pass


def func():
  try:
    raise NetworkError
  except NetworkError as e:
    print('Первый обработчик, id исключения:', id(e))
    raise


try:
  func()
except NetworkError as e:
  print('Второй обработчик, id исключения:', id(e))
Первый обработчик, id исключения: 140255202487744
Второй обработчик, id исключения: 140255202487744

Задача для закрепления

Вводится 2 целых числа. Необходимо вывести их сумму. В случае, если одно или оба введенных параметра не являются целым числом, необходимо вывести конкатенацию введенных строк. Используйте механизм исключений.


Реализуйте декоратор, который вызывает задекорированную функцию пока она не выполнится без исключений, но не более n раз — параметр декоратора. Если превышено количество попыток, должно быть возбуждено исключение типа TooManyErrors.

Подпишитесь на рассылку

Если это было вам полезно — вы можете сказать нам спасибо!