在an answer到my 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不会被初始化。
确实这是由于编码错误,但我认为未明确处理的异常应该仍然会被提升?这让我头疼不已!我是否必须始终处理所有可能的异常?
答案 0 :(得分:1)
在离开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: