Порядок исключений Python - PullRequest
2 голосов
/ 20 июня 2011

Просто любопытно, почему следующий код

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 ]

8 голосов
/ 20 июня 2011

Вы печатаете в классе, а не в его блоке инициализации.Попробуйте запустить этот

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 голос
/ 20 июня 2011

Как правильно сказал Свен, тела классов выполняются сразу же, когда выполняется определение класса.

В вашем коде ваше определение класса 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.

0 голосов
/ 20 июня 2011

у вас есть операторы на уровне класса:

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

учитывайте это, которое не будет выполнено, пока вы не создадите экземпляр объекта:

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