Python:使用lineno引发SyntaxError

时间:2015-11-15 08:31:51

标签: python parsing python-3.x exception syntax-error

我正在为域特定语言实现解析器,并希望能够引发SyntaxError。如何在引发此异常时设置文件名,行号和偏移量?

  

异常 SyntaxError

     

解析器遇到语法时引发   错误。这可能发生在import语句中,在exec语句中   调用内置函数eval()或input(),或者在读取时   初始脚本或标准输入(也是交互式)。

     

此类的实例具有filename,lineno,offset和属性   文本,以便于访问详细信息。 str()的异常实例   只返回消息。

来源:https://docs.python.org/3.2/library/exceptions.html#SyntaxError

3 个答案:

答案 0 :(得分:6)

答案是:

>>> 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元组。

答案 1 :(得分: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 ..."})

答案 2 :(得分:0)

怎么样:

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