HTML Diff
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>