返回结果并引发异常替代解决方案



如果不可能返回结果并引发异常,我应该如何解决这样的问题:

def get_person():
person = {}
person['name'] = get_name()
# e.g. get_age() can cause an error
person['age'] = get_age()
return person

通常情况下,当我无法获得年龄时,我会出错。太好了,我想要。但在一种情况下,我至少想知道这个名字。假设我们不能在该方法之外调用get_name()

try:
# person will not be even declared
person = get_person()
except ValueException as e:
if str(e) == 'cannot obtain age':
person['age'] = None
else:
raise e
...
funny_method(person)

我没有主意了。通过参数返回尚不清楚。这只是抑制了异常:

def get_person():
person = {}
person['name'] = get_name()
try:
person['age'] = get_age()
finally:
return person

当发生错误时,为age属性返回None似乎是唯一的选项,但它会改变以前的用途。

return不可能同时为值raise都为异常。但是,异常可能携带以下值:

class IncompletePerson(LookupError):
def __init__(self, person):
super().__init__(f"{person!r} information is incomplete")
self.person = person

当无法完全构建person时,将部分person传递给此异常并引发它:

def get_person():
person = {}
try:
person['name'] = get_name()
person['age'] = get_age()
except ValueError:
raise IncompletePerson(person)
else:
return person

呼叫者接收完整的person,或者如果需要,可以恢复不完整的person

try:
person = get_person()
except IncompletePerson as ip:
print(f"Only retrieved: {ip.person!r}")
else:
print(f"Fully retrieved: {person!r}")

我会得到错误。太好了,我想要。但在一种情况下,我至少想知道这个名字。

如果您想要两种不同的东西,请实现两种不同方法。调用适合您在特定情况下想要实现的目标的方法。

您需要的是这两个片段的组合。

def get_person():
person = {}
person['name'] = get_name()

try:
person['age'] = get_age()
except ValueException as e:
if str(e) == 'cannot obtain age':
person['age'] = None
else:
raise e
finally:
return person

相关内容

最新更新