НОЧУ ДПО "Национальный открытый университет "ИНТУИТ"
Опубликован: 24.01.2021 | Доступ: свободный | Студентов: 1229 / 21 | Длительность: 03:57:00
Лекция 27:

Исключительные ситуации и их обработка

< Лекция 1 || Лекция 27: 123

Смотреть на youtube

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

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

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

Семейство классов, описывающих исключительные ситуации

Семейство классов, описывающих исключения (Exception), содержит многочисленные встроенные классы и классы, создаваемые программистом. Прародителем всех встроенных классов семейства является класс BaseException, описывающий исключения любого типа. Его потомки - задают специализированные исключения. У этого класса четыре прямых потомка. Три потомка определяют исключения, порожденные устройствами компьютера, например, клавиатурой. Для нас наибольший интерес представляет четвертый потомок - класс Exception. Этот класс является родителем для более чем полусотни встроенных классов исключений. Его прямым потомком является, например, класс AriphmeticError, имеющий трех потомков - FloatingPointError, OverflowError, ZeroDivisionError. Первый из этих классов в последних версиях Python не используется. Ошибка переполнения возникает, когда результат выполнения арифметических операций над данными с плавающей точкой больше максимально возможного значения. Чаще всего возникает третье исключение при попытке деления на ноль. Больше всего потомков с разветвленной иерархией имеет класс OSError - прямой потомок класса Exception. Судя по названию, ошибки обнаруживаются при работе операционной системы, в частности, при работе с файлами.

С некоторыми встроенными классами исключений мы уже сталкивались. На прошлой лекции мы видели, что при выполнении оператора утверждений assert возникает исключительная ситуация - AssertionError, когда предикат в утверждении становится ложным. В одной из лекций по ООП при построении класса Rational программно возбуждалось исключение TypeError.

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

Встроенные классы исключений устроены весьма просто. Большинство из них имеет только один аргумент - message - сообщение, которое выдается при возникновении исключения. Некоторые из классов, - большей частью это потомки класса OSError, имеют кортеж аргументов, что позволяет более точно охарактеризовать причину возникновения ситуации. Метод __str__ для объектов таких классов позволяет получить значения аргументов.

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

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

Собственный класс исключений должен указать в качестве родителя класс Exception или одного из его потомков, но родителем не может быть класс BaseException.

Имя собственного класса следует задавать согласно общим правилам - быть содержательным и заканчиваться словом Error.

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

Представьте себе, что разрабатывается класс, описывающий некоторую игру человека с компьютером. Ход, сделанный человеком, может оказаться недопустимым в текущей позиции, возбуждая исключительную ситуацию. Класс, описывающий исключительную ситуацию для данной игры, может выглядеть так:

class MoveError(Expression):
    """
    Задает исключительную ситуацию,
    возникающую в игре, когда в позиции position
    выполняется некорректный ход move.
    Сообщение message описывает причину некорректности хода.
    """
    def __init__(self, position, move, message):
        self.position = position
        self.move = move
 self.message = message
< Лекция 1 || Лекция 27: 123
Елена Лаптева
Елена Лаптева

Думаю. что не смогу его закончить. Хотелось предупредить других - не тратьте зря время, ищите другой курс.

Михаил Сидоров
Михаил Сидоров

Если S - последовательность, то срез задается как S(i : j) и содержит j - i элементов,

а в примере используютс другие скобки - 

NL[1:3] = ["решили", "не", "искать"]

или это не срез, тогда, что это?