2017-09-25 6 views
-1

私は、try-exceptブロック内のpython break文を使って奇妙な動作に出くわしました。なぜ先行リストの割り当てによってbreakステートメントが実行されないのですか?

i=0 
lst=[] 
while i < 5: 
    try: 
     if i < 3: 
      raise Exception('spam', 'eggs') 
     #lst[0]=i 
     print('-'+str(i)+'-') 
     break 
    except: 
     i=i+1 
     print(str(i)+' ',end='') 

1 2 3 -3-

しかし、私はコメント行削除する場合:

i=0 
lst=[] 
while i < 5: 
    try: 
     if i < 3: 
      raise Exception('spam', 'eggs') 
     lst[0]=i 
     print('-'+str(i)+'-') 
     break 
    except: 
     i=i+1 
     print(str(i)+' ',end='') 

なぜリストの割り当て原因があります休憩はもはや起こらない?誰かがここで何が起こっているのか説明できますか?

+1

例外が発生するためです。 – user2357112

+1

ブロックを除いて、それは 'IndexError'を含む_all_エラーをキャッチします。 – Lafexlos

+0

**裸の句を使用しないでください** –

答えて

4

lstは空のリストです。 lst[0]など、存在しない要素にアクセスしようとすると、IndexError例外が発生します。その例外は、例外ハンドラで捕捉され、予期した結果が破損します。

まず、一般的には、ベア例外ハンドラを使用しないでください。例外ハンドラを処理する方法が分かっている例外に例外ハンドラを制限します。制限されていない例外ハンドラは、ここの場合のように、予期しない例外を隠すことを可能にします。

lstにインデックスを格納する場合は、リストの長さが十分であることを確認するか、append()またはinsert()を使用してリストの末尾または冒頭に追加します。

 
Exception('spam', 'eggs') 
ZeroDivisionError('division by zero',) 
:そのコードの出力を実行する

for i in range(2): 
    try: 
     if i == 0: 
      raise Exception('spam', 'eggs') 
     else: 
      1/0 # cause ZeroDivisionError 
    except Exception as e: 
     print(repr(e)) 

:独自の例外を作成するExceptionを使用し

しばしばそれが困難な他の人からあなたの例外を区別することができますので、いずれかを実行するための最良のものではありません

ZeroDivisionErrorExceptionのサブクラスなので、ハンドラによってもキャッチされます。今、あなたは簡単にあなたがどのように処理するかを知っている例外を確認することができ

class MyException(Exception): 
    pass 

:このコードを実行する

for i in range(2): 
    try: 
     if i == 0: 
      raise MyException('spam', 'eggs') 
     else: 
      1/0 # cause ZeroDivisionError 
    except MyException as e: 
     print(repr(e)) 

 
MyException('spam', 'eggs') 
Traceback (most recent call last): 
    File "", line 6, in 
ZeroDivisionError: division by zero 
これを解決するには、あなた自身 Exceptionサブクラスを作成することができます

は、カスタム例外がキャッチされて処理されることを示しますが、予期しない例外は発生しません。あなたが予期しないものを扱うようにしたい場合は、あまりにも、その後後の最初の2番目の例外ハンドラを追加:あなたは例外扱い

except MyException as e: 
     print(repr(e)) 
    except Exception as e: 
     print('Unexpected exception', e) 
     raise 
+0

Doh!ありがとうございました! –

1

場合:

i=0 
lst=[] 
while i < 5: 
    try: 
     if i < 3: 
      raise Exception('spam', 'eggs') 
     lst[0]=i 
     print('-'+str(i)+'-') 
     break 
    except Exception as e: 
     print(e) 
     i=i+1 
     print(str(i)) 

をあなたがIndexErrorを得ることを理解するであろう。

list assignment index out of range 

あなたのリストは空であるため、そのインデックスにアクセス/割り当てすることはできません。あなたが何をしたいかに応じて、

lst.insert(0, i) 

lst.append(i) 

insert:あなたは、リストの使用appendに項目を挿入する場合。続きを読むhere

+0

また、非常に教育的な答えです。 –

関連する問題