2015-11-15 2 views
2

Я реализую парсер для определенного для домена языка и хочу иметь возможность поднять SyntaxError. Как установить имя файла, lineno и offset при создании этого исключения?Python: raise SyntaxError with lineno

исключениеSyntaxError

Воспитанный, когда парсер встречает ошибку синтаксиса. Это может произойти в инструкции import в выражении exec в вызове встроенной функции eval() или input() или при чтении начального сценария или стандартного ввода (также в интерактивном режиме) .

Экземпляры этого класса имеют атрибуты filename, lineno, offset и текст для облегчения доступа к деталям. str() экземпляра исключения возвращает только сообщение.

Источник: https://docs.python.org/3.2/library/exceptions.html#SyntaxError

+1

Если это не синтаксическая ошибка * Python *, возможно, вам лучше создать собственное исключение. – jonrsharpe

+1

У меня была бы такая же проблема, что и подклассификация. Как бы то ни было, я * считаю, что SyntaxError является наиболее подходящим типом для синтаксической ошибки с именем файла и lineno - я бы просто изобрел его иначе. – golightlyb

+0

Я не имею в виду подклассификацию 'SyntaxError', только ваш собственный подкласс' Exception' (например, 'class MySyntaxError (Exception):'), который вы можете добавить к любым атрибутам, которые вам нравятся. – jonrsharpe

ответ

0

Как насчет:

raise SyntaxError('filename: {}, lineno: {}, offset: {}'.format(
    filename, lineno, offset)) 
+0

синтаксическая ошибка при синтаксической ошибке :) – lemonhead

+0

Спасибо за улов. Имела синтаксическую ошибку в 'SyntaxError'. ;) –

1

Вы можете посмотреть здесь: 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('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-кортеж.

Смежные вопросы