2011-06-20 10 views
2

興味があるだけ、なぜ次のコードPythonの例外注文

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 

答えて

1

:あなたがオブジェクトのインスタンスを作成するまで実行されません

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

はこのことを考慮し、クラス定義が実行されるとすぐにクラス本体が実行されます。

コードでは、クラス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')が実行されますので、これは単純です。

Infactでは、Inside Exceptionの印刷は、raiseを使用してFのインスタンスを初期化することとは関係ありません。 Fのインスタンスを初期化したかどうかにかかわらず、印刷されます。

これを試してみてください -

import sys 

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

それでもあなたはこの出力を取得します -

Inside Exception 

あなたはクラスのインスタンスを行っていないもののF.

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() 
0

あなたはクラスレベルでのステートメントがあります。当然のSvenとして

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