由于没有人回复或评论这篇文章,我决定重写这篇文章。
使用lxml考虑以下Python代码:
treeIter = etree.iterparse(fObj)
for event, ele in treeIter:
if ele.tag == 'logRoot':
try:
somefunction(ele)
except InternalException as e:
e.handle(*args)
ele.clear()
InternalException是用户定义的,除了lxml.etree.XMLSyntaxError之外,还包装来自somefunction()的所有异常。 InternalException具有明确定义的处理函数.handle()。
fObj将“trueRoot”作为顶级标记,将许多“logRoot”作为第二级标记。
我的问题是:在处理异常e时,有没有办法记录当前行号? * args可以被任何可用的参数替换。
非常感谢任何建议。
答案 0 :(得分:2)
import lxml.etree as ET
import io
def div(x):
return 1/x
content = '''\
<trueRoot>
<logRoot a1="x1"> 2 </logRoot>
<logRoot a1="x1"> 1 </logRoot>
<logRoot a1="x1"> 0 </logRoot>
</trueRoot>
'''
for event, elem in ET.iterparse(io.BytesIO(content), events=('end', ), tag='logRoot'):
num = int(elem.text)
print('Calling div({})'.format(num))
try:
div(num)
except ZeroDivisionError as e:
print('Ack! ZeroDivisionError on line {}'.format(elem.sourceline))
打印
Calling div(2)
Calling div(1)
Calling div(0)
Ack! ZeroDivisionError on line 4