Python: повысить СинтаксисError с lineno
Я реализую синтаксический анализатор для языка, специфичного для домена, и хочу иметь возможность поднять SyntaxError. Как установить имя файла, lineno и offset при создании этого исключения?
исключение SyntaxError
Поднимается, когда синтаксический анализатор встречает синтаксис ошибка. Это может произойти в инструкции import в выражении exec в вызов встроенной функции eval() или input(), или при чтении начальный script или стандартный ввод (также интерактивно).
Экземпляры этого класса имеют атрибуты filename, lineno, offset и текст для облегчения доступа к деталям. str() экземпляра исключения возвращает только сообщение.
Источник: https://docs.python.org/3.2/library/exceptions.html#SyntaxError
Ответы
Ответ 1
Ответ:
>>> raise SyntaxError('End quote missing', ("test.py", 1000, 11, "print 'bar"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "test.py", line 1000
print 'bar
^
SyntaxError: End quote missing
Второй аргумент должен быть 4-кортежем.
Ответ 2
Вы можете посмотреть здесь: https://github.com/python/cpython/blob/master/Objects/exceptions.c#L1273
Я мог бы придумать только это:
import traceback
print("Our exception")
try:
print("(1)")
raise SyntaxError('Test2', {'filename': "test.py", 'lineno': 1000, 'offset': 1, 'text': "My text ..."})
except SyntaxError as inst:
print("(2)")
print(inst.args)
print("(3) Get filename %s" % inst.args[1]['filename'])
print("(4) Traceback")
traceback.print_tb(inst.__traceback__)
Вывод:
Our exception
(1)
(2)
('Test2', {'offset': 1, 'filename': 'test.py', 'text': 'My text ...', 'lineno': 1000})
(3) Get filename test.py
(4) Traceback
File "test.py", line 7, in <module>
raise SyntaxError('Test2', {'filename': "test.py", 'lineno': 1000, 'offset': 1, 'text': "My text ..."})
Ответ 3
Как насчет:
raise SyntaxError('filename: {}, lineno: {}, offset: {}'.format(
filename, lineno, offset))