有没有一种很好的方法来处理Python中的异常?

时间:2010-06-24 22:05:54

标签: python exception

我有一堆类似于此的代码:

                try:
                    auth = page.ItemAttributes.Author
                except:
                        try:
                            auth = page.ItemAttributes.Creator
                        except:
                                auth = None

有没有更好的方法来写出这个逻辑?这使我的代码真的很难阅读。我认为尝试..最终会起作用,但我认为错了

3 个答案:

答案 0 :(得分:11)

您可以使用hasattr来避免try / except块:

auth = None
for attrname in ['Author', 'Creator']:
    if hasattr(page.ItemAttributes, attrname):
        auth = getattr(page.ItemAttributes, attrname)
        break

编写上述内容的另一种方法是使用Python else循环的for子句:

for attrname in ['Author', 'Creator']:
    if hasattr(page.ItemAttributes, attrname):
        auth = getattr(page.ItemAttributes, attrname)
        break
else:
    auth = None

答案 1 :(得分:3)

  
    

这使我的代码真的很难阅读

  

无论你做什么,都不要抓住通配符。 except:是pythonic的说法:Hey, all exceptions are equal, I want every single error in my try block to end up here, I don't care if I catch an AttributeError or a WorldGotFuckedUpException。在您的情况下,except AttributeError会更好,更容易阅读。

这只是一个侧面说明。马克的答案显示了最好的方法,恕我直言。

答案 2 :(得分:2)

@Mark Byers的答案更灵活,但如果你想要一个单行

auth = getattr(page.ItemAttributes, 'Author', None) or getattr(page.ItemAttributes, 'Creator', None)