在“for”循环中在哪里捕获异常?

0 投票
1 回答
631 浏览
提问于 2025-04-27 23:29

我有一些代码用来解析XML文件,我想稍微改进一下(主要是为了处理那些格式不正确的XML文件)。

try:
    import xml.etree.cElementTree as ET
except:
    import xml.etree.ElementTree as ET

context = ET.iterparse("myfile.xml", events=("start", "end"))
context = iter(context)
event, root = context.next()
for event, elem in context:
    if event == 'start' and elem.tag == "hello":
        print("start report")

这段代码在处理有效的XML时运行得很好:

<?xml version="1.0" ?>
<Report name="TEST" xmlns:cm="http://www.nessus.org/cm">
<hello>world</hello>
</Report>

如果我通过删除最后一个标签来让XML变得无效,我会得到一个SyntaxError异常,这正是我想要捕获的,以便处理无效的XML。

运行时的错误追踪信息:

Traceback (most recent call last):
  File "/tmp/GetNessusScans/parsereport.py", line 12, in <module>
    for event, elem in context:
  File "<string>", line 68, in __iter__
SyntaxError: no element found: line 4, column 0

我的问题是:我应该把try:放在哪里,以捕获这个异常呢?

由于文件的大小,我需要线性地解析它,我的理解是for循环最终会到达一个缺少标签(或标签不匹配)的地方。我尝试了一些奇怪的代码(except部分实际上会做一些有用的事情,这只是一个测试):

try:
    import xml.etree.cElementTree as ET
except:
    import xml.etree.ElementTree as ET

context = ET.iterparse("myfile.xml", events=("start", "end"))
context = iter(context)
event, root = context.next()
try:
    for event, elem in context:
except SyntaxError:
    print("invalid XML")
else:
    # if we hit the description of the scan, save it
    if event == 'start' and elem.tag == "hello":
        print("start report")

但正如我所怀疑的,这并不正确。

暂无标签

1 个回答

1

你可以把整个解析的部分放在一个新的 try - except 块里。这样做的原因是,XML 中的任何标签都有可能出错,不仅仅是最后一个,所以在解析的过程中,错误可能会在任何地方发生。

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET
try:
    context = ET.iterparse("myfile.xml", events=("start", "end"))
    context = iter(context)
    event, root = context.next()
    for event, elem in context:
        if event == 'start' and elem.tag == "hello":
            print("start report")
except SyntaxError, ParseError as exc:
    pass
except Exception
    pass

撰写回答