Python でのネストされた try...except ステートメントについて
try ... exception
ステートメントは、Python で例外をキャッチしたり、エラーが発生しやすいコードを実行したりするために使用されます。最近ではすべてのプログラミング言語にこの機能がありますが、Python では、これらの単語を使用し、それぞれ try...except
キーワードで表されます。try...except
とは別に、別のキーワード、つまり finally
を一緒に使用することもできます。
for
ループと同様に、これらの try
、catch
、および finally
ステートメントもネストできます。この記事では、それについて説明します。
Python でネストされた try...except
ステートメント
上記のように、これらのステートメントは、for
ループをネストするのと同じ方法でネストできます。例については、次のコードを参照してください。
a = {"a": 5, "b": 25, "c": 125}
try:
print(a["d"])
except KeyError:
try:
print("a:", a["a"])
except:
print("No value exists for keys 'a' and 'd'")
finally:
print("Nested finally")
finally:
print("Finally")
出力:
a: 5
Nested finally
Finally
ご覧のとおり、上記のプログラムは最初にいくつかのキーと値のペアで辞書を初期化し、次にキーd
の値にアクセスしようとします。キーと値のペアが存在しないため、KeyError
例外が発生し、except
ステートメントによってキャッチされます。次に、インタープリターはネストされた try
ブロックの下でコードを実行します。キーa
の値が存在するため、コンソールに出力され、ネストされた finally
ステートメントの下のコードが実行されます。最後に、外側の finally
ステートメントの下のコードが実行されます。
これは、try
、catch
、および finally
ステートメントを任意の try
、catch
、および finally
ステートメントの下に置くことができることを意味します。例を挙げてこれを理解しましょう。try
、catch
、および finally
ステートメントを含むコードを記述します。これらのステートメントはすべて、その下に try
、catch
、および finally
ステートメントもあります。
a = {
"a": 5,
"b": 25,
"c": 125,
"e": 625,
"f": 3125,
}
try:
try:
print("d:", a["d"])
except:
print("a:", a["a"])
finally:
print("First nested finally")
except KeyError:
try:
print("b:", a["b"])
except:
print("No value exists for keys 'b' and 'd'")
finally:
print("Second nested finally")
finally:
try:
print("c:", a["c"])
except:
print("No value exists for key 'c'")
finally:
print("Third nested finally")
出力:
a: 5
First nested finally
c: 125
Third nested finally
ご覧のとおり、最初に、外側の try
ブロックが実行されます。キーd
の値が見つからないため、ネストされた except
ステートメントの下のコードが実行され、ネストされた finally
が実行されます。外側の try
ブロックは実行中に例外を取得しなかったため、その except
ブロックはスキップされ、外側の finally
ブロックの下のコードが実行されます。
必要に応じてこれをさらに進め、ネストされた try
、catch
、および finally
ステートメントの n
レベルを作成することもできます。ただし、ネストされたレベルの数が増えると、制御フローまたは実行フローは少し複雑になり、管理できなくなります。try
、catch
、および finally
ステートメントをナビゲートすることは困難になります。