Существует, как минимум, два различимых вида ошибок:
Синтаксические ошибки, также известные как ошибки синтаксического анализа, являются, самой распространенной проблемой пока изучаете Python:
>>> while True print('Hello world') # File "<stdin>", line 1 # while True print('Hello world') # ^ # SyntaxError: invalid syntax
В примере ошибка обнаружена в функции print()
, так как перед ней отсутствует двоеточие ':'
. Имя файла и номер строки напечатаны, чтобы вы знали, где искать, если входные данные поступили из сценария.
Парсер повторяет ошибочную строку и отображает небольшую "стрелку", указывающую на самую раннюю точку в строке, где была обнаружена ошибка. Ошибка вызвана или, по крайней мере, обнаружена токеном, предшествующим стрелке.
Даже если оператор или выражение синтаксически верны, это может вызвать ошибку при попытке выполнить его. Ошибки, обнаруженные во время выполнения, называются исключениями и не являются безусловно фатальными. Однако большинство исключений не обрабатываются программами и приводят к сообщениям об ошибках, как показано здесь:
>>> 10 * (1/0) # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # ZeroDivisionError: division by zero >>> 4 + spam*3 # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # NameError: name 'spam' is not defined >>> '2' + 2 # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # TypeError: Can't convert 'int' object to str implicitly
Последняя строка сообщения об ошибке указывает на то, что произошло. Исключения бывают разных типов, и тип печатается как часть сообщения: типы в примере - это ZeroDivisionError
, NameError
и TypeError
. Строка, напечатанная в качестве типа исключения, является именем возникшей исключительной ситуации. Это верно для всех встроенных исключений, но не обязательно должно быть верно для пользовательских исключений, хотя это полезное соглашение. Стандартные имена исключений - это встроенные идентификаторы, не зарезервированные ключевые слова.
Остальная часть строки содержит подробности, основанные на типе исключения и причинах его возникновения.
Предыдущая часть сообщения об ошибке показывает контекст, в котором произошло исключение, в форме обратной трассировки стека. В общем случае он содержит трассировку стека, в которой перечислены исходные строки. Строки считанные из стандартного ввода - не отображаются.
Встроенные исключения перечисляют встроенные исключения и их значения.
Приемы перехвата ошибок конструкцией try/except. Оператор try может содержать несколько предложений except, чтобы указать обработчики для различных исключений. В этом случае будет выполнен только один обработчик.
Если инструкция finally присутствует, то она будет выполняться как последняя задача перед завершением выполнения конструкции try. Инструкция finally выполняется независимо от того, создает ли блок кода в операторе try исключени
В операторе try определяется обработчики исключений и/или код очистки для группы операторов.
В Python пользователи могут определять свои собственные исключения, создавая новый класс. Этот класс исключений должен быть прямо или косвенно производным от встроенного класса Exception.
Новое в Python 3.11. Группы исключений используются try/except, как и со всеми другими исключениями. Кроме того, они распознаются оператором except*, которое соответствует их подгруппам на основе типов содержащихся исключений.
Если не обрабатывать возможные ошибки, то в любой момент может все сломаться. Необходимо правильно и активно реагировать на любую ситуацию, чтобы минимизировать ошибки при обработке данных.
Инструкция raise позволяет программисту принудительно вызвать одно исключение в любое время и в любом месте кода. Повторно вызвать исключение, которое было перехвачено try/except. Создавать исключения, когда выполнение программы бессмысленно или не может продолжаться.
Утверждения Assert - это удобный способ вставить отладочные утверждения в программу.
Улучшения коснулись сообщений об ошибке SyntaxErrors, IndentationErrors, AttributeErrors и NameErrors. В материале рассматриваются отличия сообщений об ошибках в примерах.
При печати трассировки интерпретатор теперь будет указывать точное выражение, вызвавшее ошибку, а не только строку.
В Python 3.12. были реализованы следующие улучшения сообщений об ошибках...