0: Я вас приветствую на очередном видео по изучению языка python, и сегодня, чтобы понять суть механизма, который мы с вами будем изучать, мы начнём с очень простой и
1: Конкретной ситуации. Например, мы пишем с вами программу, в которой пользователь должен ввести целое число. Мы считываем это число в текстовом формате и хотим преобразовать в
2: Числовой формат, соответственно, для этого мы используем функцию int если пользователь ввёл целое число, то преобразование будет выполнено, но если пользователь введёт что-то
3: Что будет отличаться от целого числа, то, соответственно, возникнет ошибка. То есть в данном случае мы потенциально можем столкнуться с проблемой, причём возникновение или невозникновение этой проблемы.
4: Не связано с тем, как мы напишем этот код. Здесь мы всецело в руках пользователя и, соответственно, только от действий пользователя будет зависеть, корректно ли выполнится.
5: Наш код здесь, конечно, мы можем воспользоваться функцией ивл, о которой мы говорили, и пользовались с вами ранее в нескольких случаях для вычисления значения выражения, которое пользователь будет вводить. А
6: Затем уже проверить тип соответствующего значения с помощью функции тайп с этой функцией мы также с вами работали, когда знакомились с типами данных в языке python, однако все равно нет гарантии, что
7: Пользователь корректно введёт выражение, так что описанная проблема является для нас принципиальной. Если же при выполнении программы у нас происходит ошибка, то здесь говорят,
8: О том, что возникла исключительная ситуация и хорошая новость состоит в том, что в языке python есть механизм, который позволяет перехватывать и обрабатывать исключительные ситуации, другими словами.
9: Можно выразить это так, у нас имеется возможность так организовать программный код, что даже в случае выполнения, точнее возникновения ошибки программа продолжит работу в штатном режиме. И здесь есть
10: Делаю небольшое отступление и скажу о том, что сейчас мы с вами рассмотрим более простые приёмы, которые связаны с использованием системы обработки исключительных ситуаций, а более подроб.
11: Мы поговорим о них после того, как познакомимся с классами и объектами.
12: И обработка исключений в языке python базируется на использовании конструкции край эксеп идея очень проста и по себе красива программный код при выполнении кото.
13: Может возникнуть ошибка помещается в специальный блок. Этот блок помечается ключевым словом трай код, размещённый в этом блоке, мы будем называть контролируемым.
14: Кодом после try блока размещается блок, помеченный ключевым словом эксепт это блок обработки исключения, общий шаблон данной конструкции у вас представлен?
15: Как раз-таки на экране у нас идёт ключевое слово try с двоеточием и идут команды, которые мы с вами будем контролировать, и блок исключений да, исключительные ситуации.
16: Accept, двоеточие и после этого идут команды. И как же у нас происходит работа с данным блоком. Если подобная конструкция использована в каком-либо программном коде, то проис.
17: Ходит все следующим образом. Выполняется контролируемый код в трай блоке. Если при выполнении этого кода ошибки не возникают, то программный код в эксепт блоке просто напросто игнорируется. Если же при
18: Выполнении трай блока возникла ошибка, то дальнейшее выполнение команд в этом блоке прекращается и начинается выполнение команды уже в блоке эксепт после того, как команды в
19: Accept блоки выполнены, работы программы продолжается в обычном режиме, то есть выполняются команды после конструкции трай эксепт. В некотором смысле эта конструкция трай эксепт напоминает.
20: Условный оператор, в котором роль лс. Блока играет блок эксепт вместо проверки условия используется факт наличия или же отсутствия ошибки, хотя сама по себе констру.
21: Конструкция такая не конструкция, а аналогия довольно-таки грубая.
22: По факту же accept блок содержит код, который выполняется только если при выполнении трай блока у нас возникает ошибка стоит также заметить, что в случае возникновения ошибки в трай блоке его выполнение.
23: Прекращается на той команде, которая стала причиной ошибки и команды, которые идут после
24: Неё, просто напросто у нас не будут выполняться, и у вас на экране представлен код программы, в которой пользователю предлагается ввести целое число, и затем это число отображается в окне.
25: Вывода для обработки возможных ошибок, связанных с некорректным вводом значения, мы использовали как раз-таки конструкцию трай эксепт.
26: И здесь, возможно, несколько вариантов отработки данной программы. 1 вариант отработки программы. Я её уже скомпилировал. И давайте введём с вами целое число, например, 23.
27: Программа нам выдаёт результат. Вы ввели число 23.
28: И при выполнении программы ошибка у нас не возникла, но давайте сделаем так, если у нас возникнет все-таки ошибка,
29: И здесь мы с вами видим, что результат программы несколько иной, но важно другое. Программа выполняется в штатном режиме. Итак, 1 командой у нас
30: Выполняется команда print обработка исключений от которой сюрпризов ожидать у нас не приходится далее очередь доходит до блока try с 2 командами, команда нам инт.
31: Input. Введите число. Считывается введённое пользователем значение и выполняется попытка преобразовать его в целое число. Именно на этом этапе у нас с вами и может возникнуть
32: Как раз-таки ошибка. Допустим, у нас все прошло нормально, да, как в 1 нашем случае тогда выполняется следующая команда print. Вы ввели число и нам предста.
33: Является наше число в как раз-таки блоке тай, и тогда, соответственно, команда в блоке эксепт у нас не выполняется.
34: И, а выполняется с пропуском блока эксепт команда print. Спасибо за сотрудничество уже, которая идёт после блока. Трай эксепт. Теперь давайте с вами
35: Разберём другую ситуацию, которую мы видим на нашем экране. Мы воспроизведём ошибку в нашем трай блоке. В таком случае выполнение
36: Блока у нас прекратится сразу же после того, как мы с вами введём некорректное число и начнётся выполнение команды в блоке эксепт, где нам выдаётся.
37: Сообщение о том, что нужно ввести целое число после завершения этой конструкции.
38: Выполняется команда спасибо за сотрудничество. На самом деле тема перехвата и обработки исключений, а также их искусственного генерирования очень многогранна, а соответствующие механизм
39: Очень являются гибкими и продуктивными, как я уже говорил ранее, мы их обсудим немного позже, поскольку для этого нам нужно иметь хоть какое-то
40: Представление о классах, объектах и наследовании. Но 1 пример мы рассмотрим прямо сейчас, и связан он с тем, что ошибки разных типов можно обрабатывать по разному. Дело в том, что ошибки бывают
41: Разными. И у каждой ошибки. То есть будь то ошибка, да, исключение есть тип. Или же его ещё можно назвать классом в конструкции трай эксепт можно использовать несколько блоков.
42: Каждый из которых будет обрабатывать ошибки определённого типа. И шаблон для этого представлен как раз-таки у вас на экране.
43: Так, например, ошибка, связанная с преобразованием введённого пользователем значения к целочисленному формату, у нас будет относиться к классу вэлью, если в программе
44: Предпринимается попытка обратиться к несуществующей переменной, то есть переменной, которой предварительно не присвоено значение, то генерируется исключение класса name.
45: Ошибка type error возникает при несовместимости типов попытки выполнить некорректную операцию, то есть операция, которая недоступна для данных определённого типа, так?
46: При попытке, например, деления на 0 генерируется исключение класса деления на 0 да zero division error, если неправильно опять-таки указать индекс.
47: Элемента списка будет сгенерирована ошибка класса индекс эро, и то, как вся эта информация может использоваться на практике, как раз-таки демонстрирует код, который представлен
48: У вас на экране и данная программа, в общем то простая, но содержит много скрытых опасностей. Начинается все с выполнения команды print операции над списком чисел.
49: После начинаются выполняться команды из блока трай команда намс, ивл инпут, введите целое число, считывается и вычисляется значение выражения, которое вводит
50: Пользователь. Здесь мы ожидаем, что пользователь введёт выражение для списка с целочисленным элементом. И уже на этом этапе могут возникнуть проблемы, если пользователь введёт значение, которое интерпре
51: Не сможет вычислить далее командой print. Это наша следующая строчка. Отображается конструкция, которая вычислена на основе введённого пользователем.
52: Выражение. Эта команда нужна для того, чтобы было легче понять, что же прочитала программа. После этого 2 данные строчки выполняются однотипные команды, а
53: Int намс и b int намс какие ошибки здесь могут возникнуть во первых мы индексируем переменную намс что не всегда возможно будет сделать во вторых если список не
54: То начальный элемент намс 0 существует, но элемента намс 3 в списке может и не быть. Здесь у нас имеется ввиду, что элемент с индексом 3
55: Будет только если в списке не меньше 4 элементов. Далее 3, даже если элементы с указанными индексами есть, не факт, что они могут быть преобразованы в целочисленный
56: Тип int казалось бы да, мы написали всего 7 строчек кода, а уже количество возможных ошибок у нас перевалило за 5, далее при.
57: Выполнение команды на 8 строчке может возникнуть проблема если значение переменной б у нас будет равно нулю, а на 0, как мы знаем, делить нельзя.
58: Такой вот, да, опасный программный код мы с вами написали далее в блоке эксепт. У нас происходит обработка ошибок 6.
59: Различных типов. Здесь мы с вами видим value, error, zero, division, error, type error, индекс синтекс и name error. Здесь обработка очень
60: Простая при возникновении ошибки появляется сообщение с классом ошибки, чтобы легче было её идентифицировать сработавшим в определённом эксепт блоке и краткое описание причины ошибки завер.
61: Программа сообщением о том, что произошло завершение программы и да, то есть print завершения программы с этим сообщением. Ну и давайте посмотрим на отработку нашей программы.
62: В зависимости от того, какое выражение пользователь может ввести, и начнём мы с того случая, когда пользователь у нас ведёт целочисленный список с достаточным, то есть не менее 4.
63: Количеством элементов в списке и последний элемент у нас будет отличным от нуля.
64: Я ввёл числовой список в квадратных скобках 2, 5, 7, 8 и 1. Мы получили ответ от нашей программы, что получено следующее значение и происходит у нас следующее вычисление.
65: В данном случае при выполнении программы исключения не генерируется и ни 1 из accept блоков у нас не выполняется давайте рассмотрим следующую ситуацию пользова.
66: Вводит текстовое значение, также скажу в кавычках да, это важно, например, он вводит слово python.
67: И данное значение у нас считывается как текст, текст, как и список, можно индексировать, но при попытке преобразовать 1 букву текста в целочисленное значение.
68: Да, у нас это определено изначально a and b намс 0 возникает ошибка класса value error, то есть ошибка преобразования, причём ошибка возникает именно на этапе.
69: Преобразование в число. Выражение само намс 0 у нас вычисляется нормально. Теперь же давайте с вами введём это без кавычек тоже самое.
70: И если сравнивать с предыдущим вариантом, у нас есть изменения чтобы понять причину, следует вспомнить, как работает функция ивл. Эта функция вычисляет значение выражения.
71: Содержащегося в тексте, который является аргументом функции если пользователь вводит выражение python в кавычках, то функцию ивл передаётся выражение именно python.
72: Да, в кавычках.
73: И вычисляться будет именно это выражение. Это текст. Именно он и возвращается функцией ивл. А вот если пользователь вводит пайтон, как в нашем случае сейчас без кавычек, то
74: Функцию ивл передаётся выражение
75: Python в кавычках, а уже вычисляется, будет само вот данное выражение интерпретатор воспринимает это выражение как название переменной но
76: Такой переменной у нас не существует, поэтому на этапе вычисления введённого пользователем значения, то есть команда намс ивл.
77: Input введите числовой список. Возникает ошибка name error.
78: То есть она нам говорит о том, что мы ввели с вами неверный идентификатор. Давайте ещё 1 ситуацию рассмотрим. Она схожа с предыдущей, но теперь пользователь вводит не
79: Не 1 слово, a2, например, да.
80: Опять мне там начал писать hello.
81: World.
82: Интерпретатор в этом случае пытается вычислить значение выражения хэллоу ворлд, но на этот раз он данную конструкцию как имя переменной не воспринимает, а просто не может понять, что это за выражение, и
83: В результате возникает синтаксическая ошибка syntax error, да, то есть невозможно вычислить выражение почему? Потому что переменные у нас должны быть, ну, должны писаться слит.
84: Вот если б там был нижний пробел, то как раз-таки ошибка была бы схожа с предыдущей. Теперь давайте сымитируем ситуацию, когда пользователь у нас вводит
85: Список, в котором всего 3 элемента и поэтому элемента с индексом 3 у нас попросту быть не может. Давайте введём 1, 2, 3.
86: Здесь уже ошибка возникает на этапе вычисления выражения намс 3.
87: То есть мы не можем получить элемент с индексом 3. Далее, что будет, если в списке элемент с индексом 3 у нас будет равен нулю? Давайте воспроизведём эту ошибку.
88: И видим, что здесь у нас возникает ошибка Зера дивижн эро при выполнении выражения, а делить на б, поскольку предпринимается попытка как раз-таки деления на 0 ещё.
89: 1 ошибку можем воспроизвести, когда пользователь у нас вводит целое число.
90: Здесь мы при попытке проиндексировать значение переменной намс, да.
91: Вот здесь мы её индексируем напомню, возникает ошибка класса type error, поскольку к целым числам операция индексирования у нас не применима.
92: Конечно, хорошо, что механизм персональной обработки это, конечно, здорово, но здесь, может быть, и она будет проблема.
93: И эта проблема будет заключаться в том, что довольно сложно предусмотреть, какого типа ошибки, в принципе у нас могут возникнуть, поэтому обычно подстраховываются созданием эксепт блока.
94: Для обработки ошибок определённого типа, а последним, добавляет эксепт блок без указания типа ошибки этот блок обрабатывает все ошибки, которые не обрабатываются уже персона.
95: Персональными блоками. Эксепт и подобный код у вас как раз-таки представлен на экране.
96: Это, по сути, тот же самый код, который был у нас в начале. Да, здесь есть несколько ошибок.
97: Но он с небольшими изменениями, в нём оставлены эксеп блоки для обработки ошибок классов, Зера division, error и index error, а прочие ошибки обрабатываются.
98: Последним эксепт блоком и давайте воспроизведём случай, когда у нас нет с вами ошибок. Вводим с вами список.
99: И мы получаем, что ошибок в нашем случае нет. Давайте попробуем ввести с вами текст. Текст сначала попробуем ввести в кавычках.
100: Здесь мы получаем сообщение о том, что что-то пошло не так и происходит завершение программы. Теперь попробуем ввести без кавычек.
101: Мы снова получаем, что что-то у нас пошло не так и
102: Завершаем программу. Если же мы с вами введём несколько слов.
103: Точно также что-то пошло не так и завершение программы.
104: Попробуем ввести список точно также из 3 элементов, как и в прошлый, в прошлую программу здесь мы получаем ошибку index error да неверный индекс элемента.
105: Сейчас давайте с вами воспроизведём ошибку с нулевым 4 элементом в нашем списке вводим
106: Здесь мы получаем ошибку деления на 0, да, и точно также завершаем нашу программу, ну и последнюю ошибку, которую нам с вами осталось здесь воспроизвести, когда пользователь вводит целое число.
107: Мы снова получаем сообщение о том, что что-то пошло не так, и программа завершается удобство такого подхода, когда используется эксепт блок без указания типа ошибки.
108: Стоит в том, что нет необходимости идентифицировать типы генерируемых ошибок по сути, данный блок ловит все, что в принципе можно поймать, должен быть последним.
109: В списке эксепт блоков. Объяснение такое. При генерировании исключения начинают проверяться эксепт блоки на предмет совпадения типа ошибки, указанной в блоке, и типа ошибки, которая у нас
110: В принципе, возникло. Если совпадение есть, то выполняются команды соответствующего эксепт блока. Блоки проверяются в том порядке, в котором они указаны в коде, если
111: Гипотетически блок эксепт без идентификатора типа ошибки размещался не последним, то он бы обрабатывал все ошибки, которые не были обработаны до него. Поэтому
112: Не было бы смысла размещать после него эксепт блоки с какими-либо конкретными типами да ошибок.
113: Ну и на этом данное видео заканчивается в этом видео мы с вами познакомились с обработкой исключительных ситуаций, с генерированием и обработкой исключительных ситуаций.
114: Более подробно мы