如果不可能返回结果并引发异常,我应该如何解决这样的问题:
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