Различия между версиями 1 и 2
Версия 1 от 2018-11-30 17:03:21
Размер: 4798
Редактор: FrBrGeorge
Комментарий:
Версия 2 от 2018-11-30 17:41:00
Размер: 4781
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 75: Строка 75:
Оператор `raise`  Оператор `raise`
Строка 99: Строка 99:
    except Exc1:      except Exc1:
Строка 101: Строка 101:
    except Exc2:      except Exc2:
Строка 103: Строка 103:
    except ZeroDivisionError:      except ZeroDivisionError:
Строка 117: Строка 117:
  {{{#!usr/bin/env python3   {{{#!python

Декораторы методов и исключения

Декораторы методов

  • Метод класса (self → type(self)): @classmethod

  • Просто функция в объекте (self, … ) → (…) @staticmethod

  • Getter/Setter: @property

    • Моделирование:
         1 class C:
         2     def __init__(self):
         3         self._x = None
         4 
         5     def getx(self):
         6         return self._x
         7 
         8     def setx(self, value):
         9         self._x = value
        10 
        11     def delx(self):
        12         del self._x
        13 
        14     x = property(getx, setx, delx, "I'm the 'x' property.")
      
      • Декораторы: @property (это getter) / @setter / @deleter:

           1     @property
           2     def x(self):
           3         """I'm the 'x' property."""
           4         return self._x
           5 
           6     @x.setter
           7     def x(self, value):
           8         self._x = value
           9 
          10     @x.deleter
          11     def x(self):
          12         del self._x
        

Исключения

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

Синтаксическая ошибка SyntaxError — не обрабатывается (ещё такие ошибки?)

Оператор try:

  • Клауза except

    • Вариант except Исключение

      • Исключения — объекты Python3 (унаследованы от BaseException)

      • Дерево исключений, перехват всех дочерних
      • Собственные исключения (унаследованы от Exception, а не BaseException — некоторые исключения перехватывать не стоит)

        •    1 class B(Exception):
             2     pass
             3 
             4 class C(B):
             5     pass
             6 
             7 class D(C):
             8     pass
             9 
            10 for cls in [B, C, D]:
            11     try:
            12         raise cls()
            13     except D:
            14         print("D")
            15     except C:
            16         print("C")
            17     except B:
            18         print("B")
          

        А теперь по переставляем пары строк except … print() :)

    • Вариант except Исключение as идентификатор, произвольные параметры исключения

  • Клауза else: — если исключений не было

  • Клауза finally: — выполняется даже если исключение не перехвачено

Оператор raise

  • вариант raise Exception vs. raise Exception(параметры) — по идее Exception — это класс, а Exception() — объект, но на самом деле при выходе исключения всё равно изготавливается объект

Исключения — не «ошибки», а способ обработки некоторых условий не так, где они были обнаружены.

Пример:

   1 class Exc1(Exception): pass
   2 class Exc2(Exception): pass
   3 
   4 def funerr(a,b):
   5     if a<b:
   6         raise Exc1("A must be greater than B")
   7     return a//b
   8 
   9 def justfun(a,b):
  10     if a<b:
  11         raise Exc2("A must be greater than B")
  12     c = funerr(2*a, 3*b)
  13     return c
  14 
  15 for a,b in (10,3),(5,5),(10,0):
  16     try:
  17         c = justfun(a,b)
  18     except Exc1:
  19         c = -1
  20     except Exc2:
  21         c = -2
  22     except ZeroDivisionError:
  23         c = -3
  24     print(c)

Исключения порождаются в разных местах, а обрабатываются в одном:

Оператор with

Например, with open("file") as f: …

Или (сначала сделать простой вариант, без __init__ и raise)

  •    1 class CM:
       2     def __init__(self, val = None):
       3         self.val = val
       4 
       5     def __enter__(self):
       6         print(">>>")
       7 
       8     def __exit__(self, *args):
       9         print("<<<",*(c for c in args if c))
      10         return self.val
      11 
      12 with CM(True) as f:
      13     print("Working")
      14     raise(SyntaxError("WTF?"))
      15 
      16 print("Done")
    

Далее см. contextlib.html

Д/З

TODO

LecturesCMC/PythonIntro2018/11_Exceptions (последним исправлял пользователь FrBrGeorge 2018-12-10 09:31:39)