1 added
1 removed
Original
2026-01-01
Modified
2026-02-26
1
<h2>Введение</h2>
1
<h2>Введение</h2>
2
<p>В этом уроке вы узнаете о важном средстве языка, без которого крупная программа не может обойтись. Речь пойдет об исключениях. Что это такое, как ими пользоваться и как создавать собственные?</p>
2
<p>В этом уроке вы узнаете о важном средстве языка, без которого крупная программа не может обойтись. Речь пойдет об исключениях. Что это такое, как ими пользоваться и как создавать собственные?</p>
3
<p>Исключительные ситуации или исключения (exceptions) - это ошибки, обнаруженные при исполнении. Например, к чему приведет попытка чтения несуществующего файла? Или если файл был случайно удален пока программа работала? Такие ситуации обрабатываются при помощи исключений.</p>
3
<p>Исключительные ситуации или исключения (exceptions) - это ошибки, обнаруженные при исполнении. Например, к чему приведет попытка чтения несуществующего файла? Или если файл был случайно удален пока программа работала? Такие ситуации обрабатываются при помощи исключений.</p>
4
<p>Если же Python не может понять, как обойти сложившуюся ситуацию, то ему не остается ничего кроме как поднять руки и сообщить, что обнаружил ошибку. В общем, исключения необходимы, чтобы сообщать программисту об ошибках.</p>
4
<p>Если же Python не может понять, как обойти сложившуюся ситуацию, то ему не остается ничего кроме как поднять руки и сообщить, что обнаружил ошибку. В общем, исключения необходимы, чтобы сообщать программисту об ошибках.</p>
5
<p>Простейший пример исключения - деление на ноль:</p>
5
<p>Простейший пример исключения - деление на ноль:</p>
6
<p>В данном случае интерпретатор сообщил нам об исключении ZeroDivisionError - делении на ноль.</p>
6
<p>В данном случае интерпретатор сообщил нам об исключении ZeroDivisionError - делении на ноль.</p>
7
<h2>Traceback</h2>
7
<h2>Traceback</h2>
8
<p>В большой программе исключения часто возникают внутри. Чтобы упростить программисту понимание ошибки и причины такого поведения Python предлагает Traceback или в сленге - трэйс. Каждое исключение содержит краткую информацию, но при этом полную, информацию о месте появления ошибки. По трэйсу найти и исправить ошибку становится проще.</p>
8
<p>В большой программе исключения часто возникают внутри. Чтобы упростить программисту понимание ошибки и причины такого поведения Python предлагает Traceback или в сленге - трэйс. Каждое исключение содержит краткую информацию, но при этом полную, информацию о месте появления ошибки. По трэйсу найти и исправить ошибку становится проще.</p>
9
<p>Рассмотрим такой пример:</p>
9
<p>Рассмотрим такой пример:</p>
10
<p>В данном примере чётко видно, какой путь исполнения у программы. Смотрим снизу вверх и по шагам понимаем, как же мы докатились до такого исключения.</p>
10
<p>В данном примере чётко видно, какой путь исполнения у программы. Смотрим снизу вверх и по шагам понимаем, как же мы докатились до такого исключения.</p>
11
<p>Рассмотрим какие ещё встречаются комментарии к исключениям:</p>
11
<p>Рассмотрим какие ещё встречаются комментарии к исключениям:</p>
12
<p>В данном примере при попытке сложить целое число и строку мы получаем исключение TypeError. В описании сразу же становится ясно, что же мы не так написали.</p>
12
<p>В данном примере при попытке сложить целое число и строку мы получаем исключение TypeError. В описании сразу же становится ясно, что же мы не так написали.</p>
13
<p>Приведение строчки к целому числу приводит к исключению ValueError.</p>
13
<p>Приведение строчки к целому числу приводит к исключению ValueError.</p>
14
<p>В трэйсе этих двух примеров можно прочесть, что в таком-то файле на такой-то строчке есть ошибки.</p>
14
<p>В трэйсе этих двух примеров можно прочесть, что в таком-то файле на такой-то строчке есть ошибки.</p>
15
<p>На этом список встроенных исключений не заканчивается, в следующем разделе рассмотрены основные исключения и причины их возникновения.</p>
15
<p>На этом список встроенных исключений не заканчивается, в следующем разделе рассмотрены основные исключения и причины их возникновения.</p>
16
<h2>Иерархия исключений</h2>
16
<h2>Иерархия исключений</h2>
17
<p>Исключение, которое вы не увидите при выполнении кода - это BaseException - базовое исключение, от которого берут начало остальные.</p>
17
<p>Исключение, которое вы не увидите при выполнении кода - это BaseException - базовое исключение, от которого берут начало остальные.</p>
18
<p>В иерархии исключений две основные группы:</p>
18
<p>В иерархии исключений две основные группы:</p>
19
<ul><li>Системные исключения и ошибки</li>
19
<ul><li>Системные исключения и ошибки</li>
20
<li>Обыкновенные исключения</li>
20
<li>Обыкновенные исключения</li>
21
</ul><p>Если обработку первых лучше не делать (если и делать, то надо четко понимать для чего), то обработку вторых целиком и полностью Python возлагает на плечи программиста.</p>
21
</ul><p>Если обработку первых лучше не делать (если и делать, то надо четко понимать для чего), то обработку вторых целиком и полностью Python возлагает на плечи программиста.</p>
22
<p>К системным можно смело отнести:</p>
22
<p>К системным можно смело отнести:</p>
23
<ul><li>SystemExit - исключение, порождаемое функцией sys.exit при выходе из программы.</li>
23
<ul><li>SystemExit - исключение, порождаемое функцией sys.exit при выходе из программы.</li>
24
<li>KeyboardInterrupt - возникает при прерывании программы пользователем (обычно сочетанием клавиш Ctrl+C).</li>
24
<li>KeyboardInterrupt - возникает при прерывании программы пользователем (обычно сочетанием клавиш Ctrl+C).</li>
25
<li>GeneratorExit - возникает при вызове метода close объекта generator.</li>
25
<li>GeneratorExit - возникает при вызове метода close объекта generator.</li>
26
</ul><p>Остальные исключения - это "обыкновенные". Спектр уже готовых исключений велик.</p>
26
</ul><p>Остальные исключения - это "обыкновенные". Спектр уже готовых исключений велик.</p>
27
<p>Для Python2 иерархию исключений можно представить так:</p>
27
<p>Для Python2 иерархию исключений можно представить так:</p>
28
-
<p>Список исключений покрывает большой объем ситуаций и ошибок программиста. Если предупреждения (warning) только просят обратить внимание, то ошибки уже могут остановить исполнение программы.</p>
28
+
<p>Список иск��ючений покрывает большой объем ситуаций и ошибок программиста. Если предупреждения (warning) только просят обратить внимание, то ошибки уже могут остановить исполнение программы.</p>
29
<p>В Python3 появились новые исключения и иерархия стала такова:</p>
29
<p>В Python3 появились новые исключения и иерархия стала такова:</p>
30
<p>В целом заметно, что при создании Python3 добавлен блок новых исключений. Но даже этих почти 70 исключений не хватает при написании программ на языке Python.</p>
30
<p>В целом заметно, что при создании Python3 добавлен блок новых исключений. Но даже этих почти 70 исключений не хватает при написании программ на языке Python.</p>
31
<h2>Использование исключений</h2>
31
<h2>Использование исключений</h2>
32
<p>Мы рассмотрели что такое исключения, какие они бывают и как их анализировать. Но до сих пор явно не рассмотрели такую важную вещь, как их использование.</p>
32
<p>Мы рассмотрели что такое исключения, какие они бывают и как их анализировать. Но до сих пор явно не рассмотрели такую важную вещь, как их использование.</p>
33
<p>Начнем с обработки.</p>
33
<p>Начнем с обработки.</p>
34
<h3>Обработка исключений</h3>
34
<h3>Обработка исключений</h3>
35
<p>Давайте рассмотрим случай с делением на 0.</p>
35
<p>Давайте рассмотрим случай с делением на 0.</p>
36
<p>Данный код приведет к исключению ZeroDivisionError. Чтобы этого не случилось, воспользуемся конструкцией try..except, например, так:</p>
36
<p>Данный код приведет к исключению ZeroDivisionError. Чтобы этого не случилось, воспользуемся конструкцией try..except, например, так:</p>
37
<p>Если исполнить этот код, то на консоль будет выведена строка "<em>integer division or modulo by zero</em>". Казалось бы, что толком ничего это нам не дало, ошибка все также есть. Однако в блок except можно поместить обработку.</p>
37
<p>Если исполнить этот код, то на консоль будет выведена строка "<em>integer division or modulo by zero</em>". Казалось бы, что толком ничего это нам не дало, ошибка все также есть. Однако в блок except можно поместить обработку.</p>
38
<p>Например, мы условились, что значение переменной<em>c</em>в случае ошибки деления равно -1. Тогда модифицируем код:</p>
38
<p>Например, мы условились, что значение переменной<em>c</em>в случае ошибки деления равно -1. Тогда модифицируем код:</p>
39
<p>Перед тем как идти дальше, рассмотрим ещё одну возможность.</p>
39
<p>Перед тем как идти дальше, рассмотрим ещё одну возможность.</p>
40
<p>Пускай у нас файл с данными в файловой системе, и необходимо его прочитать. В этом случае сразу же всплывают несколько исключительных ситуаций, такие как: нет файла, файл битый, файл пустой (по заданию мы знаем, что в нём данные) и другие.</p>
40
<p>Пускай у нас файл с данными в файловой системе, и необходимо его прочитать. В этом случае сразу же всплывают несколько исключительных ситуаций, такие как: нет файла, файл битый, файл пустой (по заданию мы знаем, что в нём данные) и другие.</p>
41
<p>Используя исключения, можно вот так решить эту задачу:</p>
41
<p>Используя исключения, можно вот так решить эту задачу:</p>
42
<p>В данном вымышленном коде новый ход - перехват нескольких видов исключений. Когда исключение брошено, оно сравнивается сверху вниз с каждым типом, пока не найдено совпадение. Если совпадения нет, то исключение пойдет наверх по цепочке исполнения кода.</p>
42
<p>В данном вымышленном коде новый ход - перехват нескольких видов исключений. Когда исключение брошено, оно сравнивается сверху вниз с каждым типом, пока не найдено совпадение. Если совпадения нет, то исключение пойдет наверх по цепочке исполнения кода.</p>
43
<p>Если обработка для разных типов исключений одинакова, то уменьшить количество кода становится не проблемой:</p>
43
<p>Если обработка для разных типов исключений одинакова, то уменьшить количество кода становится не проблемой:</p>
44
<h3>Вызов исключений</h3>
44
<h3>Вызов исключений</h3>
45
<p>При работе с исключениями программист тратит большую часть времени на обработку, но при этом возникают ситуации, когда исключениями надо и бросать в других.</p>
45
<p>При работе с исключениями программист тратит большую часть времени на обработку, но при этом возникают ситуации, когда исключениями надо и бросать в других.</p>
46
<p>На сленге программистов "бросить исключение" означает написать код, который при исполнении будет инициировать исключительную ситуацию.</p>
46
<p>На сленге программистов "бросить исключение" означает написать код, который при исполнении будет инициировать исключительную ситуацию.</p>
47
<p>Например, функция, которая решает квадратное уравнение. Вы условились, что корни только вещественные, тогда в случае комплексных корней стоит бросить исключение.</p>
47
<p>Например, функция, которая решает квадратное уравнение. Вы условились, что корни только вещественные, тогда в случае комплексных корней стоит бросить исключение.</p>
48
<p>Чтобы бросить исключение необходимо воспользоваться<strong>raise</strong></p>
48
<p>Чтобы бросить исключение необходимо воспользоваться<strong>raise</strong></p>
49
<p>Пример:</p>
49
<p>Пример:</p>
50
<p>где IOError это класс исключения.</p>
50
<p>где IOError это класс исключения.</p>
51
<p>Если при обработке исключения вы желаете пробросить его ещё выше, то следует написать такой код:</p>
51
<p>Если при обработке исключения вы желаете пробросить его ещё выше, то следует написать такой код:</p>
52
<h3>Собственные исключения</h3>
52
<h3>Собственные исключения</h3>
53
<p>При написании собственных программ разумное желание добавить выразительности коду, а так же обратить внимание других программистов на особые исключительные ситуации. Для решения этой задачи стоит использовать собственные исключения.</p>
53
<p>При написании собственных программ разумное желание добавить выразительности коду, а так же обратить внимание других программистов на особые исключительные ситуации. Для решения этой задачи стоит использовать собственные исключения.</p>
54
<p>В минимальном исполнении необходимо наследоваться от какого-нибудь класса в иерархии исключений. Например так:</p>
54
<p>В минимальном исполнении необходимо наследоваться от какого-нибудь класса в иерархии исключений. Например так:</p>
55
<p>Тогда можно бросить своё исключение:</p>
55
<p>Тогда можно бросить своё исключение:</p>
56
<p>Легко заметить, мы создаем класс, а значит всё, что мы знаем о классах, справедливо и для исключений. Можно завести переменные и делать их обработку.</p>
56
<p>Легко заметить, мы создаем класс, а значит всё, что мы знаем о классах, справедливо и для исключений. Можно завести переменные и делать их обработку.</p>
57
<p>Как правило, исключения это очень маленькие классы. Они должны выполняться максимально быстро.</p>
57
<p>Как правило, исключения это очень маленькие классы. Они должны выполняться максимально быстро.</p>
58
<h2>Дополнение: Полная форма try..except</h2>
58
<h2>Дополнение: Полная форма try..except</h2>
59
<p>Форма try...except не полная, полной же является try..except..else..finally.</p>
59
<p>Форма try...except не полная, полной же является try..except..else..finally.</p>
60
<p>Применение полной конструкции может заметно упростить код, а также сделать его более безопасным.</p>
60
<p>Применение полной конструкции может заметно упростить код, а также сделать его более безопасным.</p>
61
<p>Представим, что в программе происходит чтение файла и необходимо убедиться, что объект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally.</p>
61
<p>Представим, что в программе происходит чтение файла и необходимо убедиться, что объект файла был корректно закрыт и что не возникло никакого исключения. Этого можно достичь с применением блока finally.</p>
62
<p>Иными словами, finally выполняет блок инструкций в любом случае, было ли исключение, или нет. А инструкция else выполняется в том случае, если исключения не было.</p>
62
<p>Иными словами, finally выполняет блок инструкций в любом случае, было ли исключение, или нет. А инструкция else выполняется в том случае, если исключения не было.</p>
63
<p>В целом, использование полной формы таково:</p>
63
<p>В целом, использование полной формы таково:</p>
64
<h2>Выводы</h2>
64
<h2>Выводы</h2>
65
<p>В уроке рассмотрены вопросы связанные с исключениями:</p>
65
<p>В уроке рассмотрены вопросы связанные с исключениями:</p>
66
<ul><li>Что такое исключение</li>
66
<ul><li>Что такое исключение</li>
67
<li>Какие типы исключений присутствуют в языке</li>
67
<li>Какие типы исключений присутствуют в языке</li>
68
<li>Как обрабатывать исключения</li>
68
<li>Как обрабатывать исключения</li>
69
<li>Как вызвать исключения</li>
69
<li>Как вызвать исключения</li>
70
<li>Как создавать собственные исключения</li>
70
<li>Как создавать собственные исключения</li>
71
</ul>
71
</ul>