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 ステートメントをナビゲートすることは困難になります。
