Python异常处理-避免写入30+;尝试除块

Python异常处理-避免写入30+;尝试除块,python,dictionary,exception-handling,Python,Dictionary,Exception Handling,我有一本用xml填充的字典。字典有很多键值对。我必须用字典中的值填充自定义对象。如果字典中的一个键不存在或值不是预期的类型,我想捕获异常,记录哪个键并继续执行。有没有比用try-expect块包围每条线更好的方法。具体来说,我想避免使用这种语法,它满足了我的需要,但我想知道是否有更有效的解决方案: try: my_object.prop1 = dictionary['key1'] except Exception as e: log.write('key1') try:

我有一本用xml填充的字典。字典有很多键值对。我必须用字典中的值填充自定义对象。如果字典中的一个键不存在或值不是预期的类型,我想捕获异常,记录哪个键并继续执行。有没有比用try-expect块包围每条线更好的方法。具体来说,我想避免使用这种语法,它满足了我的需要,但我想知道是否有更有效的解决方案:

try:
    my_object.prop1 = dictionary['key1']
except Exception as e:
    log.write('key1')

try:
    my_object.prop2 = dictionary['key2']
except Exception as e:
    log.write('key2')

try:
    my_object.prop3 = dictionary['key3']
except Exception as e:
    log.write('key3')

....

以编程方式进行

props_keys = {
    'prop1': 'key1'
    'prop2': 'key2',
    'prop3': 'key3'
}

for prop, key in props_keys.iteritems():
    try:
        setattr(myobj, prop, mydict[key])
    except KeyError:
        log(key)

注意,我在这里也使用了
KeyError
;尽量使捕获到的异常尽可能具体。如果
prop1
可能引发自身错误,请将其添加到预期错误列表中。

我会在for语句中用key替换key,prop以避免索引,这不是完全自我解释的。是的,是的,这是一个有效的改进。
for key, prop in [('key1', 'prop1'), ('key2', 'prop2'), ('key3', 'prop3')]:
    try:
        setattr(my_object, prop, dictionary[key])
    except KeyError:
        log.write(key)