Python - 在异常点处异常后继续

时间:2012-02-08 18:53:42

标签: python python-3.x

我正在尝试从xml文件中提取数据。我的代码示例如下:

    from xml.dom import minidom
    dom = minidom.parse("algorithms.xml")
    ...
       parameter = dom.getElementsByTagName("Parameters")[0]
       # loop over parameters
       try:
            while True:
                parameter_id = parameter.getElementsByTagName("Parameter")[m].getAttribute("Id")
                parameter_name = parameter.getElementsByTagName("Name")[m].lastChild.data
                ...
                parameter_default = parameter.getElementsByTagName("Default")[m].lastChild.data
                print parameter_id
                print parameter_default
                m = m+1
        except IndexError:
            #reached end of available parameters
            pass
        #except AttributeError:
            #parameter doesn't exist
            #?

如果每个参数的所有元素都存在,则代码可以正确运行。不幸的是,我提供的数据经常缺少条目,引发了AttributeError异常。如果我只是简单地传递了那个错误,那么就会跳过任何确实存在但在循环中稍后检索的元素而不是异常发生的元素,这是我不想要的。我需要一些方法来继续代码停止的地方,如果引发了这个特定的异常,则跳到下一行代码。

我能想到解决这个问题的唯一方法是覆盖minidom的类方法并在那里捕获异常,但这似乎太麻烦了,太多的工作来处理应该是一个非常简单和常见的问题。是否有一些更容易处理的方法,我错过了?

2 个答案:

答案 0 :(得分:3)

为什么不抽象出那部分呢?

而不是“每个语句的单独的try-except块”
def getParam(p, tagName, index, post=None):
    post = post or lambda i: i
    try:
        return post(p.getElementsByTagName(tagname)[index])
    except AttributeError:
        print "informative message"
    return None # will happen anyway, but why not be explicit?

然后在循环中,您可以拥有以下内容:

parameter_id = getParam(parameter, "Parameter", m, lambda x: x.getAttribute("Id"))
parameter_name = getParam(parameter, "Name", m, lambda x: x.lastChild.data)
...

答案 1 :(得分:1)

我认为你的问题分为两部分。首先,您希望循环在第一个AttributeError之后继续。这可以通过将try和except移动到循环中来实现。

这样的事情:

try:
    while True:
        try:
            parameter_id = parameter.getElementsByTagName("Parameter")[m].getAttribute("Id")
            parameter_name = parameter.getElementsByTagName("Name")[m].lastChild.data
            ...
            parameter_default = parameter.getElementsByTagName("Default")[m].lastChild.data
            print parameter_id
            print parameter_default
            m = m+1
        except AttributeError:
            print "parameter doesn't exist"
        #?
except IndexError:
    #reached end of available parameters
    pass

第二部分更棘手。但是其他答案很好地解决了这个问题。