在“for”循环中在哪里捕获异常?
我有一些代码用来解析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