попробуй… кроме… иначе… наконец

Когда скрипт Python вызывает исключение времени выполнения, если он не обрабатывается, программа завершает работу и завершает работу. Если мы хотим контролировать поток программы в этих сценариях, мы должны использовать обработку исключений. В этом блоге мы используем следующий блок кода, чтобы понять поток:

import random
try:
    options = [0, 1]
    selection = random.choice(options)
    print(f"""Executing TRY block with selection {selection} """)
    print(5/selection)
except:
    print("Exception happend, Executing exception handler code block")
else:
    print("TRY block completed successfully, Executing ELSE code block")
finally:
    print("What do you think you can skip me? Wrong!! I am inevitable")

Здесь мы пытаемся случайным образом сгенерировать ошибку деления на ноль.

Блок try выполняется до тех пор, пока не встретится исключение. Если он сталкивается с исключением, он передает управление в блок исключений, в противном случае он передает управление в блок else → finally. Внутри предложения except обрабатывается исключение (конкретное или общее). В идеале мы должны предвидеть множественные исключения и различать, как программа должна реагировать на них.

Блок finally выполняется независимо от того, произошло или не произошло исключение. Он используется для освобождения внешних ресурсов.

Exception — это базовый класс для всех исключений в Python. Ниже приведена иерархия исключений:

+-- Exception
      +-- StopIteration
      +-- StandardError
      |    +-- BufferError
      |    +-- ArithmeticError
      |    |    +-- FloatingPointError
      |    |    +-- OverflowError
      |    |    +-- ZeroDivisionError
      |    +-- AssertionError
      |    +-- AttributeError
      |    +-- EnvironmentError
      |    |    +-- IOError
      |    |    +-- OSError
      |    |         +-- WindowsError (Windows)
      |    |         +-- VMSError (VMS)
      |    +-- EOFError
      |    +-- ImportError
      |    +-- LookupError
      |    |    +-- IndexError
      |    |    +-- KeyError
      |    +-- MemoryError
      |    +-- NameError
      |    |    +-- UnboundLocalError
      |    +-- ReferenceError
      |    +-- RuntimeError
      |    |    +-- NotImplementedError
      |    +-- SyntaxError
      |    |    +-- IndentationError
      |    |         +-- TabError
      |    +-- SystemError
      |    +-- TypeError
      |    +-- ValueError
      |         +-- UnicodeError
      |              +-- UnicodeDecodeError
      |              +-- UnicodeEncodeError
      |              +-- UnicodeTranslateError

В операторе try может быть более одного предложения exclude для указания обработчиков различных исключений. Мы можем передать конкретный класс исключений в предложение exclude, и оно будет обрабатывать только те исключения, которые обрабатываются этим конкретным классом исключений.

try:
    pass
except ZeroDivisionError:
    pass
except TypeError:
    pass
########====OR=========#####
try:
    pass
except (ZeroDivisionError, TypeError, AssertionError):
    # If there is any exception from the given exception list, 
    # then execute this block.
    pass

Мы даже можем зарегистрировать собственное исключение, основанное на бизнес-логике.

class InsuffcientBalanceError(ValueError):
   def __init__(self, arg):
      self.args = arg
try:
   raise InsuffcientBalanceError("Balance can't be negative")
except InsuffcientBalanceError, e:
   print(e.args)

Мы можем даже вручную вызывать исключения.

raise [Exception [, args [, traceback]]]
  • Поднять исключение с цепочкой для трассировки
raise RuntimeError from exc
  • Утверждение (Raise…if) позволяет нам условно вызвать исключение
import sys
assert ('linux' in sys.platform), "This code runs on Linux only."

Надеюсь, это было полезно. Продолжайте кодировать!

Дополнительные материалы на PlainEnglish.io. Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter и LinkedIn. Посетите наш Community Discord и присоединитесь к нашему Коллективу талантов.