Python:';内联';一行代码中多个异常源的异常处理
考虑下面这段简单的代码,它将Python:';内联';一行代码中多个异常源的异常处理,python,exception,Python,Exception,考虑下面这段简单的代码,它将MyClass()对象的一些属性存储在一个列表中: c = MyClass() props = [c.property1, c.property2, ..., c.propertyN] 现在,在引擎盖下,c.property1..N被实现为@property-修饰的getter函数,在执行过程中可能引发异常。在这种情况下,我希望在列表分配中使用默认值(“n/a”),而不是不可访问的属性值 但我不想跳过整个列表作业。因此,如果只有c.property2导致异常,结果仍
MyClass()
对象的一些属性存储在一个列表中:
c = MyClass()
props = [c.property1, c.property2, ..., c.propertyN]
现在,在引擎盖下,c.property1..N
被实现为@property
-修饰的getter函数,在执行过程中可能引发异常。在这种情况下,我希望在列表分配中使用默认值(“n/a”),而不是不可访问的属性值
但我不想跳过整个列表作业。因此,如果只有c.property2
导致异常,结果仍然应该是:
props = ['value_of_property1', 'n/a', ..., 'value_of_propertyN']
因此,除了围绕整个列表分配外,我无法将try包装起来:
c = MyClass()
try:
props = [c.property1, c.property2, ..., c.propertyN]
except MyException:
props = # yes, what?
当然,除了每个元素之外,我可以单独尝试:
c = MyClass()
props = []
try:
props.append(c.property1)
except MyException:
props.append('n/a')
try:
props.append(c.property2)
except MyException:
props.append('n/a')
# repeated N times
。。。但这会使代码膨胀,感觉不对劲
是否存在某种类型的内联异常处理?
可能与这些内联if-else语句类似:
props = [c.property1 if len(c.property1) else 'n/a',
c.property2 if len(c.property2) else 'n/a',
...
c.propertyN if len(c.propertyN) else 'n/a',
]
注意事项:
- 我可以完全控制
和getter函数的代码MyClass()
- 修改getter函数以在内部处理异常并立即返回默认值不是一个选项,因为在其他情况下,我想知道(通过异常…)属性是否可访问。否则,我如何判断“n/a”是属性的真实值还是替换的默认(回退)值
- 我在使用
(N*'{};').format(c.property1,c.property2,…,c.propertyN)打印语句时也有同样的问题。
- 没有内联异常处理,但有更好的方法:循环。您的代码中没有一个是正确的,但这很容易通过循环修复:
c = MyClass()
props = []
prop_names = ['property1', 'property2', ...]
for prop_name in prop_names:
try:
value = getattr(c, prop_name)
except MyException:
value = 'n/a'
props.append(value)
如果需要执行比仅访问属性更复杂的操作,可以使用函数列表替换属性名称列表:
c = MyClass()
props = []
getters = [lambda c: c.property1, lambda c: c.property2, ...]
for getter in getters:
try:
value = getter(c)
except MyException:
value = 'n/a'
props.append(value)
对于
print
问题,请使用print(*props,sep=';')
。另请参阅:@Aran Fey Yes-只要props
已经存在,并且预期的输出格式与上述示例中的格式一样简单。因此,您是否建议先创建列表(使用下面答案中的getattr()
循环),然后打印列表中的元素,而不是直接打印属性?