未处理的例外消失

时间:2014-12-12 18:33:03

标签: python exception-handling

an answermy question中有一个小错字。根据答案,我需要处理KeyError,所以我尝试了

def GetInputData(inputdict, attributelist):
    result = {}
    try:
        result = {a: inputdict[v] for a in attributelist}
    except KeyError as KE:
        print "KeyError", KE
        decodeok = False
    else:
        decodeok = True
    finally:
        return decodeok, result

这有效(在第4行修复错误后...... [v]应为[a])。

问题是try-except-finally导致隐藏未处理的NameError。 Try会在NameError异常中断为Finally部分,因此decodeok不会被初始化。

确实这是由于编码错误,但我认为未明确处理的异常应该仍然会被提升?这让我头疼不已!我是否必须始终处理所有可能的异常?

2 个答案:

答案 0 :(得分:1)

来自documentation

  

在离开try语句之前总是执行finally子句,   是否发生了异常。当有例外时   发生在try子句中并且没有被except处理   子句(或者它发生在except或else子句中),它是   在finally子句执行后重新提出。

所以NameError并不是finally未提出try:def get_input_data(input_dict, attributes, check=False): """If check is True, raises a KeyError if a key in attributes is not in the input dictionary.""" if check: return {a: input_dict[a] for a in attributes} else: return {a: input_dict[a] for a in input_dict.viewkeys() & attributes} 块之前执行的问题。左

无论如何,我建议像这样定义你的功能:

try: 
    get_input_data(input_dict, attributes, check=True)
except KeyError:
    # do what makes sense

这样,如果属性不在字典中,用户可以决定他或她是否想要抛出错误。这就是例外的目的 - 允许代码的用户决定如果出现特殊但非意外的情况会发生什么。

因此,作为此功能的用户,我可能会写:

{{1}}

如果我想要进行错误检查。

答案 1 :(得分:0)

你不必使用无穷无尽的

except SomeException:

您可能想要使用

except Exc1, Exc2, ExcN as SomeValue:

或只是

except Exception as exc: