对于自定义异常的try / except感到困惑

时间:2014-11-04 11:09:48

标签: python try-catch except

我的代码:

class AError(Exception):
    print 'error occur'
for i in range(3):
    try:
        print '---oo'
        raise AError
    except AError:
        print 'get AError'
    else:
        print 'going on'
    finally:
        print 'finally'

当我运行上面的代码时,输​​出是这样的:

error occur
---oo
get AError
finally
---oo
get AError
finally
---oo
get AError
finally

我认为字符串"error occur"应该出现三次,例如"---oo",但它只出现一次;为什么呢?

4 个答案:

答案 0 :(得分:11)

为了澄清Paul's answer,这是一个简单的例子:

class Test(object):

    print "Class being defined"

    def __init__(self):
        print "Instance being created"


for _ in range(3):
    t = Test()

此输出将为:

Class being defined
Instance being created
Instance being created
Instance being created

class定义中的代码,但方法def之外的代码仅在定义类时运行一次。

如果您希望代码在创建实例时运行,则应该在__init__ 实例方法中(或者,有时候,{{1} } 类方法)。但请注意,如果为子类定义__new__,则应该确保它还调用超类__init__

__init__

这确保子类支持超类的参数;在class AError(Exception): def __init__(self, *args, **kwargs): Exception.__init__(self, *args, **kwargs) # call the superclass print 'error occur' # print your message 的情况下,您可以例如传递错误信息:

Exception

有关>>> raise AError("Something went wrong.") error occur # your message gets printed when the instance is created Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> raise AError("Something went wrong.") AError: Something went wrong. # the error message passes through to the traceback 语法的说明,如果您不熟悉它,请参阅例如: What does ** (double star) and * (star) do for parameters?。您也可以使用*args, **kwargs来调用超类方法,例如Understanding Python super() with __init__() methods

答案 1 :(得分:5)

'error occur'仅为整个课程打印一次。

您可能希望它为所创建的类的每个实例运行。

要实现这一点,请将其放入__init__函数

class AError(Exception):
    def __init__(self):
        print 'error occur'

__init__在创建AError的实例时被调用。

答案 2 :(得分:2)

我强烈建议您不要在Exception中放置任何打印语句,尤其是不是他们的建设者!例外是语义实体,如果需要,可以打印出来。如果必须自动化打印,请至少使用logging或类似的包。

您可能不知道的是,您可以收集异常实例以便在except子句中使用,如下所示:

class MyError(Exception):
    pass

for i in range(3):
    try:
        print '---oo'
        raise MyError("error msg no. {}".format(i))
        # Exception usually always accept a string as their first parameter
    except MyError, ex:
        # Exception instance available inside the except clause as `ex`
        print ex
    else:
        print 'going on'
    finally:
        print 'finally'

答案 3 :(得分:1)

'error occur'字符串只出现一个,因为Python在解析AError类定义时会执行它。

如果您希望每次创建类的实例时都执行它,则必须定义类的初始化程序:

class AError(Exception):
    def __init__(self):
        print 'error occur'

for i in range(3):
    try:
        print '---oo'
        raise AError
    except AError:
        print 'get AError'
    else:
        print 'going on'
    finally:
        print 'finally'

玩得开心(也可以阅读语言手册......)