python中的错误异常处理

时间:2014-02-15 19:45:30

标签: python python-2.7

这是我的代码:

class personData ():
    def __init__(self, age, spouse = None, children = 0):
        self.age = age
        self.children = children
        self.spouse = spouse
        if self.spouse == None:
            del self.spouse
            print "A %s year old person" % str(self.age)    


    def marries(self, name):
        if self.spouse == None:
            self.spouse = name
        else:
            try:
                self.marries(name)
            except Exception as detail:
                print "spouse exists:", self.spouse

    def divorces(self):
       if self.spouse == None:
            raise AttributeError,  " Not married, divorce impossible"

我想做的是:

def divorces(self):
 if self.spouse != None:    ##   thats mean the person has a spouse,
   self.spouse = None       ##    I think that should remove the spouse, right?

如果我们再次调用离婚,这应该是例外,因为配偶被移除了。

我们说:

person = personData(30, 'Sue')

person.spouse将为Sue,如果我致电person.marries('Anna'),则会引发异常,现在如果我致电person.divorce(),则会移除配偶('Sue') 。我所坚持的是,当我打电话给person.divorce()时,它应该提出异常,说“没有配偶存在”而且我无法做到这一点,任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

您没有直接提出异常,如果提出异常是期望的结果,那么这是合适的。 (或者,您可以只打印一条消息而不处理任何异常。)您无需在此处使用try - except。相反,只需提出异常,例如:

if self.spouse == None:
    raise Exception( 'Divorce called but no spouse' )

此外,您永远无法访问当前try部分,因为hasattr(self, 'spouse')始终为真。另一件事是你的婚姻异常正在发生,因为marries的无限递归调用,而不是因为直接引发异常。您不应该从marries内部调用marries

答案 1 :(得分:2)

def divorces(self):
    if hasattr(self, 'spouse'):
        self.spouse = None

这将始终返回Truespouse属性可能设置为None,但它仍然设置。因此永远不会达到打印错误的else分支。

所以,您需要将其更改为:

    if self.spouse == None:
        raise Exception('Not married')

在您正在执行的__init__功能中:

    if self.spouse == None:
        del self.spouse

我会跳过这个,并将self.spouse设为None;这样就不需要getattr()

实施例

由于您似乎对完整解决方案感到有些困惑,所以这是整个班级:

class personData ():
    def __init__(self, age, spouse = None, children = 0):
        self.age = age
        self.children = children
        self.spouse = spouse

    def marries(self, name):
        # There is already a spouse, we don't do polygamy
        if self.spouse != None:
            raise AttributeError("Already married")

        # There is no spouse, so we can marry. You may kiss and a all that.
        self.spouse = name

    def divorces(self):
        # There is no spouse, so we can't divorce
        if self.spouse == None:
            raise AttributeError("Not married, divorce impossible")

        # We diverse, and reset the spouse
        self.spouse = None


person = personData(30, 'Sue')
person.divorces()
person.marries('Anna')
person.divorces()

# This gives an error
person.divorces()

奖金提示

marries()函数中,您正在执行:

try:
    marries(self,name)
except Exception as detail:
    print "spouse exists:", self.spouse

这是不正确的。这样做,是将类实例marries()self作为参数调用函数name(不存在)。

您想要做的是:

self.marries(name)

这将调用类实例marries()上的函数selfself参数由Python自动添加,您无需自己添加它来进行简单的函数调用。

此错误未被注意,因为您正在捕获所有异常。这些“必须抓住它们所有”的口袋妖怪异常几乎总是一个坏主意,因为你不仅捕捉到了你预期的错误,而且捕捉了没有期望的所有错误,例如编程错误。

(我也很困惑为什么你在这里使用递归?)