我的代码:
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"
,但它只出现一次;为什么呢?
答案 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'
玩得开心(也可以阅读语言手册......)