В чем смысл SyntaxError
встроенного в python? Кажется, он не имеет практического применения, потому что SyntaxError
обнаружена интерпретатором python до запуска кода. Пример:
try:
&@!5_+ #SyntaxError
except: pass
Это происходит с ошибкой SyntaxError
потому что SyntaxError
найдена до того, как ее можно будет обработать. Теперь это работает и не работает, как задумано:
try:
raise SyntaxError
except: pass
Тем не менее, я никогда не видел function
или class
или что-либо, SyntaxError
. Так почему же это так легко использовать и ловить, когда единственное использование, кажется, поднимает его бессмысленно? Есть ли место, где Python вызывает SyntaxError
чтобы ее можно было перехватить? Или он просто выходит из встроенной области просто чтобы быть там?
Я считаю, что документация не требует пояснений:
Возникает, когда синтаксический анализатор обнаруживает синтаксическую ошибку. Это может произойти в операторе импорта, при вызове встроенных функций
exec()
илиeval()
или при чтении исходного сценария или стандартного ввода (также в интерактивном режиме).
import ...
, __import__(...)
, exec(...)
и eval(...)
? Это оно?
Самый простой способ решить этот вопрос - найти, как это исключение возникает на практике. У меня уже есть исходный код CPython, поэтому я сделал
find . -type f -name "*.py" | xargs grep "raise SyntaxError"
Мы видим, что есть служебный скрипт, который выполняет преобразования файлов, который вызывает синтаксическую ошибку, если он не видит магический байт в правильном месте. Кроме того, библиотека xml
использует их при разборе выражений XPath.
Это говорит о том, что он предназначен для использования пользовательским кодом, который также занимается разбором других вещей. Поисковый запрос Google для "повышения SyntaxError" показывает множество результатов этого использования таким образом.
Я не очень хорошо знаком с внутренностями Python, но я предполагаю, что возможность обрабатывать ошибки при обработке исходного кода так же, как они обрабатывают другие ошибки, делает вещи лучше. Плюс eval
и т.д. Должны что-то поднять, как документы и предыдущее состояние ответа.
Там очень редко используется для использования SyntaxError
в вашей программе. Обычно он используется только для интерпретатора Python, когда встречается с неверным синтаксисом.
Единственный случай, когда я могу подумать, что вы когда-нибудь поймаете SyntaxError
это если вы используете exec
или eval
для неизвестного значения. Например, если вы выполняли пользовательский ввод, то этот ввод может быть недействительным, и вам нужно будет перехватить SyntaxError
.
ast.literal_eval
.