Являются ли исключения 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 был поднят и пойман во время выполнения, что, на мой взгляд, по крайней мере, указывает на то, что это ошибка выполнения.