Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование.Python.8-10.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
1.2 Mб
Скачать

Переменные экземпляра

Перейдем к следующей строчке:

class Fib:     def __init__(self, max):         self.max = max

  1. Что такое self.max? Это переменная экземпляра. Она не имеет ничего общего с переменной max, которую мы передали в метод init() в качестве аргумента. self.max является «глобальной» для всего экземпляра. Это значит, что вы можете обратиться к ней из других методов.

class Fib:     def __init__(self, max):         self.max = max            def __next__(self):         …                  if fib > self.max:             …

  1. self.max определена в методе __init__

  2. …и использована в методе __next__.

Переменные экземпляра связаны только с одним экземпляром класса. Например, если вы создадите два экземпляра класса Fib с разными максимальными значениями, каждый из них будет помнить только свое собственное значение.

>>> import fibonacci2  >>> fib1 = fibonacci2.Fib(100)  >>> fib2 = fibonacci2.Fib(200)  >>> fib1.max  100  >>> fib2.max  200

Плановая обработка ошибок при помощи исключений в Python

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

Traceback (most recent call last):  File "…\src\debug\tserver\_sandbox.py", line 5, in <module>

File "…\src\debug\tserver\_sandbox.py", line 4, in <fragment>

builtins.IOError: [Errno 2] No such file or directory: 'A.txt'

Последняя строка сообщения показывает, что произошло. Исключения бывают разного типа, этот тип выводится в сообщении.

>>> 10 * (1/0)  Traceback (innermost last): File "<stdin>", line 1  ZeroDivisionError: integer division or modulo  >>> 4 + spam * 3  Traceback (innermost last): File "<stdin>", line 1 NameError: spam  >>> '2' + 2  Traceback (innermost last): File "<stdin>", line 1  TypeError: illegal argument type for built-in operation

Типы исключений в приведенном примере: ZeroDivisionError, NameError и TypeError. Имена стандартных исключений являются встроенными идентификаторами, но не являются зарезервированными ключевыми словами.

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

Обработка исключений

Вы можете писать программы, которые будут обрабатывать определенные исключения. Посмотрите на следующий пример, в котором пользователю будет выдаваться приглашение до тех пор, пока не будет введено целое число или выполнение не будет прервано (обычно Ctrl-C). Во втором случае генерируется исключение KeyboardInterrupt.

>>> while 1:  … try:  …     x = int(input("Введите, пожалуйста, целое число: "))  …     break  … except ValueError:  …     print "Вы ошиблись. Попробуйте еще раз…"  …

Инструкция try работает следующим образом.

  • Сначала выполняется ветвь try (инструкции, находящиеся между ключевыми словами try и except).

  • Если не возникает исключительной ситуации, ветвь except пропускается и выполнение инструкции try завершается.

  • Если во время выполнения ветви try генерируется исключение, оставшаяся часть ветви пропускается. Далее, если тип (класс) исключения соответствует указанному после ключевого слова except, выполняется ветвь except и выполнение инструкции try завершается.

  • Если исключение не соответствует указанному после ключевого слова except, то оно передается внешнему блоку try или, если обработчик не найден, исключение считается не перехваченным, выполнение прерывается и выводится сообщение об ошибке.

Если исключение не обрабатывается, значение исключения выводится в сообщении об ошибке после имени класса исключения.

Обработчик перехватывает не только исключения, сгенерированные непосредственно в блоке try, но и в вызываемых из него функциях.