Python异常排序

时间:2011-06-20 16:22:57

标签: python python-2.x

好奇,为什么以下代码

import sys
class F(Exception):
    sys.stderr.write('Inside exception\n')
    sys.stderr.flush()
    pass

sys.stderr.write('Before Exception\n')
sys.stderr.flush()

try:
    raise F
except F:
    pass

输出:

Inside exception
Before Exception

而不是:

Before exception
Inside Exception

3 个答案:

答案 0 :(得分:8)

您在课程中打印,而不是在初始化块中打印。试试这个

import sys
class F(Exception):
    sys.stderr.write('Inside exception\n')
    sys.stderr.flush()
    pass

单独。即,当你拨打raise F时,它没有运行。试试这个

import sys
class F(Exception):
    def __init__():
        sys.stderr.write('Inside exception\n')
        sys.stderr.flush()

raise new F()

答案 1 :(得分:1)

正如Sven所说,在执行类定义时会立即执行类主体。

在您的代码中,您对类F的定义高于此命令sys.stderr.write('Before Exception\n'),因此首先执行此sys.stderr.write('Inside exception\n'),因此首先看到其输出。

作为测试,运行此程序 -

import sys

sys.stderr.write('Before Exception\n')
sys.stderr.flush()

class F(Exception):
    sys.stderr.write('Inside exception\n')
    sys.stderr.flush()
    pass

try:
    raise F
except F:
    pass

现在你得到的输出是 -

Before exception
Inside Exception

这只是因为语句sys.stderr.write('Before Exception\n')在类定义执行之前执行。

事实上,Inside Exception的打印与初始化F的实例(使用raise)无关。无论你是否初始化F的实例,它都会被打印出来。

试试这个 -

import sys

class F(Exception):
    sys.stderr.write('Inside exception\n')
    sys.stderr.flush()
    pass

你仍然会得到这个输出 -

Inside Exception

虽然你没有制作F类的实例。

答案 2 :(得分:0)

你在班级有陈述:

class F(Exception):
    sys.stderr.write('Inside exception\n')

考虑这一点,在创建对象实例之前不会执行:

class F(Exception):
    def __init__(self):
        sys.stderr.write('Inside exception\n')