我正在为域特定语言实现解析器,并希望能够引发SyntaxError。如何在引发此异常时设置文件名,行号和偏移量?
异常 SyntaxError
解析器遇到语法时引发 错误。这可能发生在import语句中,在exec语句中 调用内置函数eval()或input(),或者在读取时 初始脚本或标准输入(也是交互式)。
此类的实例具有filename,lineno,offset和属性 文本,以便于访问详细信息。 str()的异常实例 只返回消息。
来源:https://docs.python.org/3.2/library/exceptions.html#SyntaxError
答案 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))