0 added
0 removed
Original
2026-01-01
Modified
2026-02-21
1
<p><a>#статьи</a></p>
1
<p><a>#статьи</a></p>
2
<ul><li>17 май 2024</li>
2
<ul><li>17 май 2024</li>
3
<li>0</li>
3
<li>0</li>
4
</ul><p>"Сигналы тревоги", которые подаёт программа, когда что-то пошло не так.</p>
4
</ul><p>"Сигналы тревоги", которые подаёт программа, когда что-то пошло не так.</p>
5
<p>Иллюстрация: Freepik / Unsplash / Colowgee для Skillbox Media</p>
5
<p>Иллюстрация: Freepik / Unsplash / Colowgee для Skillbox Media</p>
6
<p>Программист, консультант, специалист по документированию. Легко и доступно рассказывает о сложных вещах в программировании и дизайне.</p>
6
<p>Программист, консультант, специалист по документированию. Легко и доступно рассказывает о сложных вещах в программировании и дизайне.</p>
7
<p>Что произойдёт, если в коде на Python встретится ошибка? Как программа отправляет сообщения об ошибках программисту и как написать собственный обработчик? За всё это отвечают исключения. Рассказываем, как они работают и как использовать их в своём коде.</p>
7
<p>Что произойдёт, если в коде на Python встретится ошибка? Как программа отправляет сообщения об ошибках программисту и как написать собственный обработчик? За всё это отвечают исключения. Рассказываем, как они работают и как использовать их в своём коде.</p>
8
<p><strong>Содержание</strong></p>
8
<p><strong>Содержание</strong></p>
9
<ul><li><a>Как работают исключения в Python</a></li>
9
<ul><li><a>Как работают исключения в Python</a></li>
10
<li><a>Обработка исключений в Python: try, except, finally, else и raise</a></li>
10
<li><a>Обработка исключений в Python: try, except, finally, else и raise</a></li>
11
<li><a>Обработка нескольких исключений</a></li>
11
<li><a>Обработка нескольких исключений</a></li>
12
<li><a>Как игнорировать ошибки в Python</a></li>
12
<li><a>Как игнорировать ошибки в Python</a></li>
13
<li><a>Создание собственных исключений</a></li>
13
<li><a>Создание собственных исключений</a></li>
14
</ul><p>Исключения (exceptions) в Python - это механизм обработки ошибок во время выполнения программы. Они позволяют программе продолжить работу после обнаружения ошибки, а не завершаться аварийно. В Python есть встроенные исключения, которые обрабатывают большинство типовых ошибок.</p>
14
</ul><p>Исключения (exceptions) в Python - это механизм обработки ошибок во время выполнения программы. Они позволяют программе продолжить работу после обнаружения ошибки, а не завершаться аварийно. В Python есть встроенные исключения, которые обрабатывают большинство типовых ошибок.</p>
15
<p>Рассмотрим такую ситуацию на примере. В коде ниже вызывается функция f1(), внутри которой находится функция f2(). Выполнение будет продолжаться до тех пор, пока интерпретатор не дойдёт до строчки print (y - 2):</p>
15
<p>Рассмотрим такую ситуацию на примере. В коде ниже вызывается функция f1(), внутри которой находится функция f2(). Выполнение будет продолжаться до тех пор, пока интерпретатор не дойдёт до строчки print (y - 2):</p>
16
def f2(y): print(y - 2) # Ошибка def f1(x): f2(x) f1('10')<p>Из строки нельзя вычесть число, поэтому в консоли появится информация об ошибке в виде трассировки Traceback с исключением TypeError:</p>
16
def f2(y): print(y - 2) # Ошибка def f1(x): f2(x) f1('10')<p>Из строки нельзя вычесть число, поэтому в консоли появится информация об ошибке в виде трассировки Traceback с исключением TypeError:</p>
17
Traceback (most recent call last): File 'c:\Python\except.py', line 10, in <module> f1('10') File 'c:\Python\except.py', line 7, in f1 f2(x) File 'c:\Python\except.py', line 3, in f2 print(y - 2) # Ошибка ~~^~~ TypeError: unsupported operand type(s) for -: 'str' and 'int'<p>В Python есть встроенные исключения для разных ситуаций. Рассмотрим некоторые из них:</p>
17
Traceback (most recent call last): File 'c:\Python\except.py', line 10, in <module> f1('10') File 'c:\Python\except.py', line 7, in f1 f2(x) File 'c:\Python\except.py', line 3, in f2 print(y - 2) # Ошибка ~~^~~ TypeError: unsupported operand type(s) for -: 'str' and 'int'<p>В Python есть встроенные исключения для разных ситуаций. Рассмотрим некоторые из них:</p>
18
<ul><li>TypeError - операция или функция применяется к объекту несоответствующего типа.</li>
18
<ul><li>TypeError - операция или функция применяется к объекту несоответствующего типа.</li>
19
</ul>a = 2 b = 'два' print(a + b) # TypeError: unsupported operand type(s) for +: 'int' and 'str'<ul><li>ValueError - операция или функция получает аргумент неподходящего значения. К примеру, исключение возникает, если попытаться преобразовать строку в число.</li>
19
</ul>a = 2 b = 'два' print(a + b) # TypeError: unsupported operand type(s) for +: 'int' and 'str'<ul><li>ValueError - операция или функция получает аргумент неподходящего значения. К примеру, исключение возникает, если попытаться преобразовать строку в число.</li>
20
</ul>print(int('привет')) # ValueError: invalid literal for int() with base 10: 'привет'<ul><li>IndexError - обращение к элементу по несуществующему индексу.</li>
20
</ul>print(int('привет')) # ValueError: invalid literal for int() with base 10: 'привет'<ul><li>IndexError - обращение к элементу по несуществующему индексу.</li>
21
</ul>mylist = ['яблоко', 'банан', 'вишня'] print(mylist[10]) # IndexError: list index out of range<ul><li>ZeroDivisionError - деление числа на ноль.</li>
21
</ul>mylist = ['яблоко', 'банан', 'вишня'] print(mylist[10]) # IndexError: list index out of range<ul><li>ZeroDivisionError - деление числа на ноль.</li>
22
</ul>a = 5 b = 0 print(a / b) # ZeroDivisionError: division by zero<ul><li>FileNotFoundError - Python не может найти файл, который мы хотим открыть.</li>
22
</ul>a = 5 b = 0 print(a / b) # ZeroDivisionError: division by zero<ul><li>FileNotFoundError - Python не может найти файл, который мы хотим открыть.</li>
23
</ul>with open('non_existent_file.txt', 'r') as f: print(f.read()) # FileNotFoundError: No such file or directory: 'non_existent_file.txt'<p>Это одни из наиболее часто встречающихся встроенных исключений в Python. Полный список можно посмотреть в <a>официальной документации</a>.</p>
23
</ul>with open('non_existent_file.txt', 'r') as f: print(f.read()) # FileNotFoundError: No such file or directory: 'non_existent_file.txt'<p>Это одни из наиболее часто встречающихся встроенных исключений в Python. Полный список можно посмотреть в <a>официальной документации</a>.</p>
24
<p>В Python есть всё необходимое для создания собственных обработчиков исключений. Это полезно, если надо реализовать нетипичное для Python поведение, которое не предусмотрели разработчики. Для этого используются блоки try, except, finally, else и raise:</p>
24
<p>В Python есть всё необходимое для создания собственных обработчиков исключений. Это полезно, если надо реализовать нетипичное для Python поведение, которое не предусмотрели разработчики. Для этого используются блоки try, except, finally, else и raise:</p>
25
<ul><li>С помощью блока try Python проверяет код на наличие исключений. Если в try встречается ошибка, выполнение переходит к первому блоку except.</li>
25
<ul><li>С помощью блока try Python проверяет код на наличие исключений. Если в try встречается ошибка, выполнение переходит к первому блоку except.</li>
26
</ul>try: print(undefined_variable)<ul><li>В блоке except содержится код, который будет выполняться, если в блоке try нашлась ошибка.</li>
26
</ul>try: print(undefined_variable)<ul><li>В блоке except содержится код, который будет выполняться, если в блоке try нашлась ошибка.</li>
27
</ul>try: print(undefined_variable) except NameError: print('Переменная не определена.')<ul><li>В finally помещают код, который будет выполняться независимо от того, была ли найдена ошибка или нет. Часто этот блок используют для работы с файлами, чтобы закрыть документ.</li>
27
</ul>try: print(undefined_variable) except NameError: print('Переменная не определена.')<ul><li>В finally помещают код, который будет выполняться независимо от того, была ли найдена ошибка или нет. Часто этот блок используют для работы с файлами, чтобы закрыть документ.</li>
28
</ul>try: f = open('my_file.txt') # Действия с файлом except FileNotFoundError: print('Файл не найден.') finally: f.close()<ul><li>Код в else выполняется, если try не нашёл исключений.</li>
28
</ul>try: f = open('my_file.txt') # Действия с файлом except FileNotFoundError: print('Файл не найден.') finally: f.close()<ul><li>Код в else выполняется, если try не нашёл исключений.</li>
29
</ul>try: n = int(input('Введите число: ')) except ValueError: print('Это не число!') else: print(f'Вы ввели число {n}')<ul><li>Ключевое слово as при обработке ошибок используется для присвоения исключению переменной. К примеру, напишем собственное исключение для обработки деления на ноль. Ошибку назовём ZeroDivisionError и присвоим переменной e. Теперь к ней можно получить доступ для печати названия ошибки в консоль.</li>
29
</ul>try: n = int(input('Введите число: ')) except ValueError: print('Это не число!') else: print(f'Вы ввели число {n}')<ul><li>Ключевое слово as при обработке ошибок используется для присвоения исключению переменной. К примеру, напишем собственное исключение для обработки деления на ноль. Ошибку назовём ZeroDivisionError и присвоим переменной e. Теперь к ней можно получить доступ для печати названия ошибки в консоль.</li>
30
</ul>try: 1/0 except ZeroDivisionError as e: print(f'Исключение: {str(e)}') # Исключение: division by zero<ul><li>Команда raise в Python используется для принудительного вызова исключения. Это может быть полезно, если мы столкнулись с условием, которое должно остановить выполнение программы или вызвать ошибку.</li>
30
</ul>try: 1/0 except ZeroDivisionError as e: print(f'Исключение: {str(e)}') # Исключение: division by zero<ul><li>Команда raise в Python используется для принудительного вызова исключения. Это может быть полезно, если мы столкнулись с условием, которое должно остановить выполнение программы или вызвать ошибку.</li>
31
</ul>raise ValueError('Недопустимое значение')<p>С помощью блоков except можно обрабатывать несколько исключений разными способами. Каждый except соответствует определённому типу ошибки.</p>
31
</ul>raise ValueError('Недопустимое значение')<p>С помощью блоков except можно обрабатывать несколько исключений разными способами. Каждый except соответствует определённому типу ошибки.</p>
32
<p>Например, если в блоке try происходит исключение TypeError, будет выполнен первый блок except, и аналогично для ZeroDivisionError:</p>
32
<p>Например, если в блоке try происходит исключение TypeError, будет выполнен первый блок except, и аналогично для ZeroDivisionError:</p>
33
try: n = '2' + 2 except TypeError: print('Сообщение о TypeError') except ZeroDivisionError: print('Сообщение о ZeroDivisionError')<p>Иногда возникает необходимость обрабатывать несколько типов исключений одинаковым образом. В этом случае можно перечислить эти исключения в одном блоке except, разделив их запятыми:</p>
33
try: n = '2' + 2 except TypeError: print('Сообщение о TypeError') except ZeroDivisionError: print('Сообщение о ZeroDivisionError')<p>Иногда возникает необходимость обрабатывать несколько типов исключений одинаковым образом. В этом случае можно перечислить эти исключения в одном блоке except, разделив их запятыми:</p>
34
try: n = '1' + 1 # Код, который может вызвать исключение TypeError или ZeroDivisionError except (TypeError, ZeroDivisionError): print('Обнаружена ошибка TypeError или ZeroDivisionError')<p>Блок except без указания конкретного типа исключения будет обрабатывать все исключения, которые не были обработаны в предыдущих блоках except, в том числе прерывание с клавиатуры, системный выход и другое.</p>
34
try: n = '1' + 1 # Код, который может вызвать исключение TypeError или ZeroDivisionError except (TypeError, ZeroDivisionError): print('Обнаружена ошибка TypeError или ZeroDivisionError')<p>Блок except без указания конкретного типа исключения будет обрабатывать все исключения, которые не были обработаны в предыдущих блоках except, в том числе прерывание с клавиатуры, системный выход и другое.</p>
35
<p>Такая форма конструкции практически не используется. Вместо этого разработчики предпочитают except Exception. Так можно сначала обработать конкретные исключения, а потом уже всё остальное.</p>
35
<p>Такая форма конструкции практически не используется. Вместо этого разработчики предпочитают except Exception. Так можно сначала обработать конкретные исключения, а потом уже всё остальное.</p>
36
<p>К примеру, в первом блоке except обработаем исключение TypeError - будем выводить в консоль сообщение Обнаружена ошибка TypeError. Второй блок except будет отлавливать остальные исключения и выводить Что-то пошло не так:</p>
36
<p>К примеру, в первом блоке except обработаем исключение TypeError - будем выводить в консоль сообщение Обнаружена ошибка TypeError. Второй блок except будет отлавливать остальные исключения и выводить Что-то пошло не так:</p>
37
try: n = '1' + 1 # Код, который может вызвать исключение except TypeError: print('Обнаружена ошибка TypeError') except Exception: print('Что-то пошло не так') # Результат: "Обнаружена ошибка TypeError"<p>Начинать обработку следует с более узких классов исключений, например TypeError. Если начать с более широкого класса, такого как Exception, то всегда будет срабатывать первый блок except:</p>
37
try: n = '1' + 1 # Код, который может вызвать исключение except TypeError: print('Обнаружена ошибка TypeError') except Exception: print('Что-то пошло не так') # Результат: "Обнаружена ошибка TypeError"<p>Начинать обработку следует с более узких классов исключений, например TypeError. Если начать с более широкого класса, такого как Exception, то всегда будет срабатывать первый блок except:</p>
38
try: n = '1' + 1 # Код, который может вызвать исключение except Exception: print('Что-то пошло не так') except TypeError: print('Обнаружена ошибка TypeError') # Результат: "Что-то пошло не так"<p>Вот написали вы код, запускаете его, а Python сыпет ошибки в консоль. Вы уверены, что это фичи, а не баги, но это надо как-то донести до интерпретатора. Для таких случаев в Python есть механизм игнорирования ошибок.</p>
38
try: n = '1' + 1 # Код, который может вызвать исключение except Exception: print('Что-то пошло не так') except TypeError: print('Обнаружена ошибка TypeError') # Результат: "Что-то пошло не так"<p>Вот написали вы код, запускаете его, а Python сыпет ошибки в консоль. Вы уверены, что это фичи, а не баги, но это надо как-то донести до интерпретатора. Для таких случаев в Python есть механизм игнорирования ошибок.</p>
39
<p>Для игнорирования исключений в Python можно использовать блок try/except. При этом нужно оставить его пустым или записать в нём оператор-заглушку pass, который ничего не делает.</p>
39
<p>Для игнорирования исключений в Python можно использовать блок try/except. При этом нужно оставить его пустым или записать в нём оператор-заглушку pass, который ничего не делает.</p>
40
<p>В Python нельзя делить на ноль, но с помощью механизма игнорирования ошибок этого можно избежать. Попробуем разделить единицу на каждое число из списка. Заметьте, что среди чисел есть ноль, поэтому выполнение должно вызвать исключения ZeroDivisionError.</p>
40
<p>В Python нельзя делить на ноль, но с помощью механизма игнорирования ошибок этого можно избежать. Попробуем разделить единицу на каждое число из списка. Заметьте, что среди чисел есть ноль, поэтому выполнение должно вызвать исключения ZeroDivisionError.</p>
41
<p>Мы же обработаем эту ошибку с помощью блока except. Используем оператор pass, чтобы Python проигнорировал ошибку:</p>
41
<p>Мы же обработаем эту ошибку с помощью блока except. Используем оператор pass, чтобы Python проигнорировал ошибку:</p>
42
lst = [4, 2, 0, -1, -3] for j in lst: try: print(1/j) # Вызовет ZeroDivisionError except ZeroDivisionError: pass<p>В результате получим:</p>
42
lst = [4, 2, 0, -1, -3] for j in lst: try: print(1/j) # Вызовет ZeroDivisionError except ZeroDivisionError: pass<p>В результате получим:</p>
43
0.25 0.5 -1.0 -0.3333333333333333<p>Важно помнить, что не стоит полностью игнорировать ошибки. Это может привести к тому, что скрытые проблемы в коде останутся незамеченными и будет сложнее отлаживать и поддерживать программу в долгосрочной перспективе.</p>
43
0.25 0.5 -1.0 -0.3333333333333333<p>Важно помнить, что не стоит полностью игнорировать ошибки. Это может привести к тому, что скрытые проблемы в коде останутся незамеченными и будет сложнее отлаживать и поддерживать программу в долгосрочной перспективе.</p>
44
<p>Лучше обрабатывать ошибки должным образом: исправлять проблему, выводить полезное сообщение об ошибке или отлавливать конкретные исключения.</p>
44
<p>Лучше обрабатывать ошибки должным образом: исправлять проблему, выводить полезное сообщение об ошибке или отлавливать конкретные исключения.</p>
45
<p>Иногда надо реализовать собственный обработчик ошибок с помощью исключений. Это делает код более безопасным и поддерживаемым. Для создания собственного исключения достаточно определить новый класс, который наследуется от базового класса Exception или от любого другого встроенного исключения:</p>
45
<p>Иногда надо реализовать собственный обработчик ошибок с помощью исключений. Это делает код более безопасным и поддерживаемым. Для создания собственного исключения достаточно определить новый класс, который наследуется от базового класса Exception или от любого другого встроенного исключения:</p>
46
class ValidationError(Exception): pass<p>В примере выше ValidationError - исключение, которое не делает ничего, кроме наследования поведения стандартного исключения Exception.</p>
46
class ValidationError(Exception): pass<p>В примере выше ValidationError - исключение, которое не делает ничего, кроме наследования поведения стандартного исключения Exception.</p>
47
<p>Продолжим код:</p>
47
<p>Продолжим код:</p>
48
class ValidationError(Exception): pass def person_age(age): if age < 0: raise ValidationError('Возраст не может быть отрицательным') elif age > 120: raise ValidationError('Возраст не может быть больше 120') return True try: person_age(150) except ValidationError as e: print(e)<p>В этом примере функция person_age использует созданное нами исключение ValidationError для проверки корректности введённого возраста. Вызов функции с некорректными данными приводит к генерации исключения ValidationError, которое затем можно перехватить и обработать.</p>
48
class ValidationError(Exception): pass def person_age(age): if age < 0: raise ValidationError('Возраст не может быть отрицательным') elif age > 120: raise ValidationError('Возраст не может быть больше 120') return True try: person_age(150) except ValidationError as e: print(e)<p>В этом примере функция person_age использует созданное нами исключение ValidationError для проверки корректности введённого возраста. Вызов функции с некорректными данными приводит к генерации исключения ValidationError, которое затем можно перехватить и обработать.</p>
49
<p>Исключения в Python полезны для написания отказоустойчивого кода. Они позволяют обрабатывать ошибки при выполнении программы и гарантировать, что код продолжит свою работу даже в неожиданных ситуациях. Однако важно понимать, что не все ошибки можно или нужно обрабатывать, - иногда лучше позволить программе завершиться с ошибкой, чтобы можно было быстро узнать о проблеме и исправить её.</p>
49
<p>Исключения в Python полезны для написания отказоустойчивого кода. Они позволяют обрабатывать ошибки при выполнении программы и гарантировать, что код продолжит свою работу даже в неожиданных ситуациях. Однако важно понимать, что не все ошибки можно или нужно обрабатывать, - иногда лучше позволить программе завершиться с ошибкой, чтобы можно было быстро узнать о проблеме и исправить её.</p>
50
<p>Python для всех</p>
50
<p>Python для всех</p>
51
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
51
<p>Вы освоите Python на практике и создадите проекты для портфолио - телеграм-бот, веб-парсер и сайт с нуля. А ещё получите готовый план выхода на удалёнку и фриланс. Спикер - руководитель отдела разработки в "Сбере".</p>
52
<p><a>Пройти бесплатно</a></p>
52
<p><a>Пройти бесплатно</a></p>
53
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>
53
<a><b>Бесплатный курс по разработке на Python ➞</b>Пройдите бесплатный курс по Python и создайте с нуля телеграм-бот, веб-парсер и сайт. Спикер - руководитель отдела разработки в "Сбере". Пройти курс</a>