Обработка ошибок и исключений в коде Python
Существует, как минимум, два различимых вида ошибок:
- синтаксические ошибки;
- исключения.
Синтаксические ошибки.
Синтаксические ошибки, также известные как ошибки синтаксического анализа, являются, самой распространенной проблемой пока изучаете Python:
>>> while True print('Hello world') # File "", line 1 # while True print('Hello world') # ^ # SyntaxError: invalid syntax
В примере ошибка обнаружена в функции print() , так как перед ней отсутствует двоеточие ‘:’ . Имя файла и номер строки напечатаны, чтобы вы знали, где искать, если входные данные поступили из сценария.
Парсер повторяет ошибочную строку и отображает небольшую «стрелку», указывающую на самую раннюю точку в строке, где была обнаружена ошибка. Ошибка вызвана или, по крайней мере, обнаружена токеном, предшествующим стрелке.
Исключения.
Даже если оператор или выражение синтаксически верны, это может вызвать ошибку при попытке выполнить его. Ошибки, обнаруженные во время выполнения, называются исключениями и не являются безусловно фатальными. Однако большинство исключений не обрабатываются программами и приводят к сообщениям об ошибках, как показано здесь:
>>> 10 * (1/0) # Traceback (most recent call last): # File "", line 1, in # ZeroDivisionError: division by zero >>> 4 + spam*3 # Traceback (most recent call last): # File "", line 1, in # NameError: name 'spam' is not defined >>> '2' + 2 # Traceback (most recent call last): # File "", line 1, in # TypeError: Can't convert 'int' object to str implicitly
Последняя строка сообщения об ошибке указывает на то, что произошло. Исключения бывают разных типов, и тип печатается как часть сообщения: типы в примере — это ZeroDivisionError , NameError и TypeError . Строка, напечатанная в качестве типа исключения, является именем возникшей исключительной ситуации. Это верно для всех встроенных исключений, но не обязательно должно быть верно для пользовательских исключений, хотя это полезное соглашение. Стандартные имена исключений — это встроенные идентификаторы, не зарезервированные ключевые слова.
Остальная часть строки содержит подробности, основанные на типе исключения и причинах его возникновения.
Предыдущая часть сообщения об ошибке показывает контекст, в котором произошло исключение, в форме обратной трассировки стека. В общем случае он содержит трассировку стека, в которой перечислены исходные строки. Строки считанные из стандартного ввода — не отображаются.
Встроенные исключения перечисляют встроенные исключения и их значения.
Обработка/перехват исключений try/except в Python
Приемы перехвата ошибок конструкцией try/except. Оператор try может содержать несколько предложений except, чтобы указать обработчики для различных исключений. В этом случае будет выполнен только один обработчик.
Инструкция finally, очистка внешних ресурсов в Python
Если инструкция finally присутствует, то она будет выполняться как последняя задача перед завершением выполнения конструкции try. Инструкция finally выполняется независимо от того, создает ли блок кода в операторе try исключени
Тонкости работы конструкции try/except/else/finally в Python
В операторе try определяется обработчики исключений и/или код очистки для группы операторов.
Создание пользовательского класса исключения в Python
В Python пользователи могут определять свои собственные исключения, создавая новый класс. Этот класс исключений должен быть прямо или косвенно производным от встроенного класса Exception.
Обработка группы исключений, оператор except* в Python
Новое в Python 3.11. Группы исключений используются try/except, как и со всеми другими исключениями. Кроме того, они распознаются оператором except*, которое соответствует их подгруппам на основе типов содержащихся исключений.
Эффективная обработка исключений в Python
Если не обрабатывать возможные ошибки, то в любой момент может все сломаться. Необходимо правильно и активно реагировать на любую ситуацию, чтобы минимизировать ошибки при обработке данных.
Инструкция raise, принудительный вызов исключений в Python
Инструкция raise позволяет программисту принудительно вызвать одно исключение в любое время и в любом месте кода. Повторно вызвать исключение, которое было перехвачено try/except. Создавать исключения, когда выполнение программы бессмысленно или не может продолжаться.
Отладочные утверждение assert в Python
Утверждения Assert — это удобный способ вставить отладочные утверждения в программу.
Улучшения сообщений об ошибках в Python 3.10
Улучшения коснулись сообщений об ошибке SyntaxErrors, IndentationErrors, AttributeErrors и NameErrors. В материале рассматриваются отличия сообщений об ошибках в примерах.
Улучшения сообщений об ошибках в Python 3.11
При печати трассировки интерпретатор теперь будет указывать точное выражение, вызвавшее ошибку, а не только строку.
Улучшения сообщений об ошибках в Python 3.12
В Python 3.12. были реализованы следующие улучшения сообщений об ошибках.
- ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
- Обработка/перехват исключений try/except
- Инструкция finally, очистка внешних ресурсов
- Тонкости работы конструкции try/except/else/finally
- Создание пользовательского класса исключения
- Обработка группы исключений, оператор except*
- Эффективная обработка исключений
- Инструкция raise, принудительный вызов исключений
- Отладочные утверждение assert
- Улучшения сообщений об ошибках 3.10
- Улучшения сообщений об ошибках 3.11
- Улучшения сообщений об ошибках 3.12
Не могу найти ошибку в коде Python?
Написал код для бота по примеру, для приема заявок и отправки в группу, но на последнем шаге не могу понять, в чем ошибка.
Вот собственно сам код:
def process_dataschet_step(message): try: chat_id = message.chat.id user = user_dict[chat_id] user.dataschet = message.text msg = bot.send_message(message.chat.id, getRegData(user, 'Данные', message.from_user.first_name), parse_mode="Markdown") bot.send_message(config.chat_id, getRegData(user, 'Данные', bot.get_me().username), parse_mode="Markdown") except Exception as e: msg = bot.reply_to(message, 'упс ошибка!') bot.register_next_step_handler(msg, process_dataschet_step)
После перехода на последний шаг выдает ошибку except и заново просит ввести данные.
- Вопрос задан более года назад
- 177 просмотров
1 комментарий
Простой 1 комментарий
Почему бы не показать содержимое эксепшена?
Решения вопроса 0
Ответы на вопрос 2
Не надо ловить абстрактный Exception вообще никогда! Тем более игнорировать его и даже не выводить в консоль. Произошла ошибка, а какая, почему произошла — ваще непонятно.
Какие тут могут случиться ошибки? Ну, например, если в user_dict нет записи с ключом chat_id, то случится KeyError. Или если в getRegData возвращается невалидный markdown-текст, то случится ошибка ApiException.
А далее после обработки exception путём его игнорирования тут снова вызывается register_next_step_handler, который приводит к тому, что вводимые пользователем данные снова попадают в тот же обработчик и — вероятно — натыкаются на ту же самую ошибку. Например, KeyError: конечно, ведь как при прошлом запуске этого обработчика не было значения с таким ключом, так и при последующих не появится.
До кучи, не надо вызывать постоянно bot.get_me(). Это каждый раз будет вызов API. Неужели имя бота меняется каждую минуту? Достаточно запомнить при запуске бота — и достаточно.
Ответ написан более года назад
Комментировать
Нравится 2 Комментировать
Для начала выведи себе ошибку хотя бы в консоль, тогда станет яснее что не так.
except Exception as e: print(e) msg = bot.reply_to(message, 'упс ошибка!')
Ответ написан более года назад
Нравится 2 1 комментарий
Deduwka @Deduwka Автор вопроса
В консоли никаких ошибок нет. Я не верно выразился скорей всего. Проблема в том что при переходе на последний шаг def process_dataschet_step(message):
он не сохраняется и данные не выводятся в сообщение юзеру и в группу. В итоге идет возврат и все по кругу. Будто юзер ввел не верные данные.
def process_rakhunok_step(message): try: int(message.text) chat_id = message.chat.id user = user_dict[chat_id] user.rakhunok = message.text msg = bot.send_message(message.chat.id, 'Введите цифры!') bot.register_next_step_handler(msg, process_dataschet_step) except Exception as e: msg = bot.reply_to(message, 'Ошибка!') bot.register_next_step_handler(msg, process_rakhunok_step)
не могу найти ошибку в коде на питоне
Найти минимальное и максимальное из чётных положительных чисел, записанных в файле input.txt . Количество чисел неизвестно. Если в файле нет чётных положительных чисел, нужно вывести число 0. Результат записать в файл output.txt .
Причем в задаче ввод вывод должны быть выполнены в двух файлах. У меня получился код:
with open ("input.txt") as file: counter=0 mi=100001 ma=0 for line in file: num=int(line) if num%2==0 and num>=0: if numma: ma=num counter+=1 else: counter+=1 if counter==0: print(0, file=open("output.txt", "w")) else: print(mi, ma, file=open("output.txt", "w"))
Моя проблема в том, что после отправки кода в проверяющую систему (информатикс) оказалось, что на 7 тестов программа выдает неверный ответ (к сожалению, эти тесты неизвестны). Как исправить?
Как определить и обрабатывать ошибки в Python
Ошибки — это неотъемлемая часть разработки программного обеспечения. Важно не только уметь их исправлять, но и обрабатывать таким образом, чтобы программа продолжала работать или завершалась корректно. В этой статье мы рассмотрим, как определить и обрабатывать ошибки в Python.
Ошибки и исключения
В Python есть два типа ошибок: синтаксические ошибки и исключения.
Синтаксические ошибки
Синтаксические ошибки возникают, когда Python не может корректно разобрать ваш код. Например:
print("Hello, world!)
Здесь отсутствует закрывающая кавычка, и Python выдаст ошибку:
File "", line 1 print("Hello, world!) ^ SyntaxError: EOL while scanning string literal
Исключения
Исключения возникают во время выполнения программы, когда что-то идет не так. Например:
10 / 0
Здесь происходит деление на ноль, и Python выдаст ошибку:
Traceback (most recent call last): File "", line 1, in ZeroDivisionError: division by zero
Обработка исключений с помощью try и except
Для обработки исключений в Python используются блоки try и except . В блоке try мы помещаем код, который может вызвать исключение, а в блоке except мы указываем, что делать, если исключение произошло. Например:
try: print(10 / 0) except ZeroDivisionError: print("Деление на ноль невозможно! ")
В этом случае, когда происходит деление на ноль, программа не завершится с ошибкой. Вместо этого, она выполнит код в блоке except и продолжит работать.
Python-разработчик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT

Обработка нескольких исключений
Иногда вам может потребоваться обрабатывать разные типы исключений. Для этого вы можете использовать несколько блоков except . Например:
try: # Возможно, здесь происходит деление на ноль # или обращение к несуществующему ключу словаря . except ZeroDivisionError: print("Деление на ноль невозможно! ") except KeyError: print("Ключ не найден в словаре! ")
Использование else и finally
В Python также есть блоки else и finally , которые могут использоваться вместе с try и except .
- else выполняется, если код в блоке try не вызвал исключений.
- finally выполняется в любом случае, независимо от того, произошло исключение или нет.
Пример использования else :
try: result = 10 / 2 except ZeroDivisionError: print("Деление на ноль невозможно! ") else: print(f"Результат деления: ") # Выведет "Результат деления: 5.0"
Пример использования finally :
try: result = 10 / 2 except ZeroDivisionError: print("Деление на ноль невозможно! ") else: print(f"Результат деления: ") # Выведет "Результат деления: 5.0" finally: print("Этот блок выполнится в любом случае! ")
Теперь вы знаете, как определить и обрабатывать ошибки в Python! Приятного кодирования!
