Являются ли исключения Python (кроме SyntaxError) ошибками выполнения?
Если я правильно понимаю, когда я запускаю программу Python, интерпретатор Python генерирует код (the .pyc
файл, который появляется рядом с .py
source), если источник не содержит синтаксической ошибки.
создает ли компилятор байт-кода какие-либо другие исключения или все остальные исключения, возникающие во время выполнения, когда .pyc
код выполняется?
2 ответов
Ну, любой тип исключения может технически быть поднятым во время выполнения через raise <exception>
. Но я предполагаю, что вы понимаете это и спрашиваете, какие исключения могут быть подняты, пока Python интерпретирует ваш код (перед выполнением). На самом деле их довольно много:
SyntaxError
: это вызывается синтаксическим анализатором при чтении кода. Это происходит из недопустимого синтаксиса, такого как несбалансированная скобка, используя ключевое слово в неправильном месте, так далее.-
IndentationError
: это подклассSyntaxError
и поднимается всякий раз, когда ваш код имеет неправильный отступ. Примером может служить:if condition: line_indented_4_spaces line_indented_3_spaces
TabError
: это подклассIndentationError
и возникает, когда вы непоследовательно смешиваете вкладки и пробелы в исходном файле.SystemError
: это вызывается интерпретатором при сбое внутренней операции. Встреча с одним обычно означает, что ваша установка Python испорчена и может потребоваться переустановка.MemoryError
: это похоже наSystemError
и может быть поднят, когда внутренняя операция терпит неудачу из-за нехватки памяти.
все эти исключения могут быть вызваны до того, как ваш код даже начнет выполняться. Первые три вызваны поврежденным исходным файлом и могут быть разрешены путем простого исправления синтаксиса или вдавливание. Последние два, однако, поднимаются самим интерпретатором для внутренних операций, которые терпят неудачу. Это означает, что они редки, но также и то, что они более серьезные и не так легко исправить.
нет шага компиляции обычно, когда вы работаете с кодом Python, поэтому я бы сказал, что все ошибки в Python, SyntaxErrors включены, являются ошибками выполнения.
например, давайте напишем этот файл:
in xrange(5):
это, очевидно, просто ерунда (мы даже назовем его nonsense.py), но давайте запустим интерпретатор:
$ python
>>> try:
... import nonsense
... except SyntaxError:
... print("A syntax error occurred at runtime!")
...
A syntax error occurred at runtime!
>>>
Итак, у вас есть это-SyntaxError был поднят и пойман во время выполнения, что, на мой взгляд, по крайней мере, указывает на то, что это ошибка выполнения.