如何在Python中使用嵌套的try/catch?

0 投票
1 回答
2718 浏览
提问于 2025-04-18 06:59

我有以下代码,里面需要处理两个语句的异常,

分别是第二行和第四行。

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

撰写回答