2016-04-22 9 views
-1

次のコードを実行すると、通常の動作ではなく例外が発生します。Python:else except try奇妙な動作

try: 
    fun1(1) 
    fun1(1) 
except Exception as e: 
    print "exception" 
else: 
    print "hi" 


def fun1(i): 
    if i == 0: 
     raise Exception() 
    else: 
     print "no exception" 

上記のコードには例外がないため、「例外なし」を出力する代わりに、出力として「例外」が表示されます。

+0

あなたは 'NameError'を取得します... –

答えて

2

お客様doは例外です。 NameErrorの例外(これはExceptionのサブクラスです)をキャッチしています。 fun1がまだ存在しないため、この例外が発生します。

try..exceptfun1()定義を移動したり、fun1()後に作成された呼び出す関数にそのコードを移動

一般的ではない例外を使用する方がよい場合もあります。これは、問題をはるかに早期に明らかにしていたはずです。あなたは物事をテストする場合、あなたはそれがはるかに少ない無関係な問題のためにスローされる可能性が高い、ValueErrorを使用することができます。

>>> try: 
...  fun1(1) 
...  fun1(1) 
... except ValueError: 
...  print "exception" 
... else: 
...  print "hi" 
... 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
NameError: name 'fun1' is not defined 
>>> def fun1(i): 
...  if i == 0: 
...   raise ValueError() 
...  else: 
...   print "no exception" 
... 
>>> try: 
...  fun1(1) 
...  fun1(1) 
... except ValueError: 
...  print "exception" 
... else: 
...  print "hi" 
... 
no exception 
no exception 
hi 
>>> try: 
...  fun1(0) 
... except ValueError: 
...  print "exception" 
... else: 
...  print "hi" 
... 
exception