2014-11-20 97 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