2014-11-20 72 views
0

拋出我有以下代碼:檢查異常在try..catch..finally代碼

class Test: 
    def __init__(self, d): 
      try: 
        self.row_number = 1 
        self.name = d['name'] 
        self.address = d['address'] 
        self.__err_flag = 0 
      except Exception, ex: 
        self.__err_flag = 1 
      finally: 
        self.val = ex.message if self.__err_flag else None 

self.__err_flag的唯一目的是檢查是否異常被抓住了。我顯然不能有這樣的條件:self.val = ex.message if ex else None

有沒有更好的方法來檢查在finally塊中是否有異常被捕獲?此外,當我以下:

t = Test({'name': 'kitty-katty'}) 
dir(t) // print _Test__err_flag 

有沒有一種方法來隱藏類的屬性,這樣做dir()時,他們不露面?

+0

您的「如何檢查是否拋出異常?」和「我如何隱藏屬性?」問題似乎是無關的。請在單獨的帖子中提問。 – Kevin 2014-11-20 19:16:06

+1

我不認爲你可以隱藏任何'dir'。 Python沒有明確的私有字段。 – simonzack 2014-11-20 19:16:31

回答

1

如果您只想在發生異常時分配self.val,請將分配置於except而不是finally

class Test: 
    def __init__(self, d): 
      self.val = None 
      try: 
        self.row_number = 1 
        self.name = d['name'] 
        self.address = d['address'] 
      except Exception, ex: 
        self.val = ex.message 
+0

我希望這些屬性能夠在創建的所有「Test」實例中出現。我通常討厭爲我的類的實例做'has_attr()'。編輯:錯過了你的行:'self.val = None' – 2014-11-20 19:18:16

+0

哪些屬性? 'val'屬性?你可以在'__init__'開始時給它分配一個None,然後在發生異常時給它一些更有意義的東西。 – Kevin 2014-11-20 19:19:11