For example, I am parsing an xml file element, and all 4 elements are required. My code this like this with minidom library:
JavaScript
x
5
1
id = pattern.getElementsByTagName("id")[0].firstChild.data
2
name = pattern.getElementsByTagName("name")[0].firstChild.data
3
trigger = pattern.getElementsByTagName("trigger")[0].firstChild.data
4
test = pattern.getElementsByTagName("test")[0].firstChild.data
5
If the xml document lack any of the 4 tags, I want to throw an IndexError exception. Should I use 4 try … except blocks to capture each element exception, or I should just capture all the 4 similar exceptions in one big block? The benefit of capturing individual errors is that I can print out more explicit error message regarding the lack of a specific xml element, but it looks verbose. Is there a good practice here?
JavaScript
1
17
17
1
try:
2
id = pattern.getElementsByTagName("id")[0].firstChild.data
3
except IndexError:
4
raise IndexError('id must exists in the xml file!')
5
try:
6
name = pattern.getElementsByTagName("name")[0].firstChild.data
7
except IndexError:
8
raise IndexError('name must exists in the xml file!')
9
try:
10
test = pattern.getElementsByTagName("test")[0].firstChild.data
11
except IndexError:
12
raise IndexError('test must exists in the xml file!')
13
try:
14
trigger = pattern.getElementsByTagName("trigger")[0].firstChild.data
15
except IndexError:
16
raise IndexError('trigger must exists in the xml file!')
17
OR
JavaScript
1
8
1
try:
2
id = pattern.getElementsByTagName("id")[0].firstChild.data
3
name = pattern.getElementsByTagName("name")[0].firstChild.data
4
trigger = pattern.getElementsByTagName("trigger")[0].firstChild.data
5
test = pattern.getElementsByTagName("test")[0].firstChild.data
6
except IndexError:
7
raise IndexError('id, name, trigger and test must exist in the xml file!')
8
Which one is better or both are not great?
Advertisement
Answer
Consider using a loop over the field names and packing the results into a dict instead!
JavaScript
1
7
1
results = {}
2
for field_name in ("id", "name", "trigger", "test"):
3
try:
4
results[field_name] = xml.getElementsByTagName(field_name)[0].firstChild.data
5
except IndexError as ex:
6
raise IndexError(f"failed to read '{field_name}' from xml {repr(ex)}")
7