如何在Python中使用嵌套的try/catch?
我有以下代码,里面需要处理两个语句的异常,
分别是第二行和第四行。
if(re.search("USN:.*MediaRenderer", datagram, flags=re.IGNORECASE)):
deviceXML = re.search("LOCATION:(.*.xml)", datagram, flags=re.IGNORECASE).group(1) # this line
root = ElementTree.fromstring(urllib2.urlopen(XMLLocation).read())
friendlyName = root.find('.//{}friendlyName'.format(Server.namespace)).text # this line
if not friendlyName in deviceList.keys():
deviceList[friendlyName] = host
self.model.setStringList(deviceList.keys())
我该如何在这里使用嵌套的try/catch呢?
我尝试了以下方法:
if(re.search("USN:.*MediaRenderer", datagram, flags=re.IGNORECASE)):
try:
deviceXML = re.search("LOCATION:(.*.xml)", datagram, flags=re.IGNORECASE).group(1)
root = ElementTree.fromstring(urllib2.urlopen(XMLLocation).read())
try:
friendlyName = root.find('.//{}friendlyName'.format(Server.namespace)).text
print "\n fname = ", friendlyName
if not friendlyName in deviceList.keys():
deviceList[friendlyName] = host
self.model.setStringList(deviceList.keys())
except:
pass
但是这让我在except那一行出现了缩进错误。
1 个回答
4
你的内部 try
块缺少一个 except
子句(这是必须的)。
try:
# do something risky
try:
# do another risky thing
except: # <-- this is required
# handle the inner exception
except Exception as exc:
# handle outer exception
不过,你可能想要重新组织一下代码,把它分成两个独立的块。这样会更整洁,也更容易理解和维护。
if(re.search("USN:.*MediaRenderer", datagram, flags=re.IGNORECASE)):
try:
deviceXML = re.search("LOCATION:(.*.xml)", datagram, flags=re.IGNORECASE).group(1)
root = ElementTree.fromstring(urllib2.urlopen(XMLLocation).read())
except:
# return, break, etc.
# no exception from previous block; proceed with processing
try:
friendlyName = root.find('.//{}friendlyName'.format(Server.namespace)).text
print "\n fname = ", friendlyName
if not friendlyName in deviceList.keys():
deviceList[friendlyName] = host
self.model.setStringList(deviceList.keys())
except Exception as exc:
# do something with the error here