Python中的错误异常处理

3

这是我的代码:

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 如果我调用 person.marries('Anna'),那么它将是 Sue。如果我调用 person.divorce(),它将删除配偶 ('Sue')。我现在遇到的问题是,当我调用 person.divorce() 时,它应该引发一个异常,指出 "没有配偶存在",但我无法做到这一点。任何帮助都将不胜感激。

2个回答

2

如果你想要引发异常,那么你应该直接引发异常。你没有必要在这里使用try-except语句。或者,你可以只输出一条消息而不处理任何异常。例如:

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

此外,您永远也不会进入当前的try部分,因为hasattr(self, 'spouse')总是为真。另一件事是,您的婚姻异常是由于marries的无限递归调用而发生的,而不是直接引发异常。您不应该从marries内部调用marries

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

这段代码总是会返回True,即使spouse属性可能被设置为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(),并将类实例selfname作为参数。

你需要做的是:

self.marries(name)

这会在类实例 self 上调用函数 marries()。Python 会自动添加参数 self,因此对于简单的函数调用,您不需要自己添加该参数。
由于您捕获了所有异常,因此未注意到此错误。这种 "Gotta catch 'em all" 类型的异常通常是个坏主意,因为您不仅捕获了预期的错误,还捕获了所有未预期的错误(如编程错误)。
(我也不明白为什么您要在这里使用递归?)

person = personData(30, 'Sue'),person.spouse将返回Sue。现在,如果我将divorces()更改为if self.spouse!= None:self.spouse = None。现在,如果我再次调用它,它应该引发异常,即“没有配偶,无法离婚”。 - MiMA
我什么也没得到,Sue仍然是配偶,divorces()没有移除Sue。 - MiMA
def divorces(self): if self.spouse == None: raise AttributeError, "未婚,无法离婚"

我的意图是:

def divorces(self):

if self.spouse != None: 这意味着这个人有配偶,

self.spouse = None 我认为这应该删除配偶,对吗?

##如果我们再次调用离婚,这里应该出现异常,因为

配偶已被删除。

- MiMA
没关系,我自己解决了。 def divorces(self): if not hasattr(self, 'spouse'): raise AttributeError, "未婚,无法离婚" else: del self.spouse谢谢你的帮助! - MiMA
如果您所说的“the post”是指您的问题(以及整个帖子),那么不,这不是SO的工作方式。 - Martin Tournoij
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接