Python でのネストされた try...except ステートメントについて

Vaibhav Vaibhav 2022年1月22日
Python でのネストされた try...except ステートメントについて

try ... exception ステートメントは、Python で例外をキャッチしたり、エラーが発生しやすいコードを実行したりするために使用されます。最近ではすべてのプログラミング言語にこの機能がありますが、Python では、これらの単語を使用し、それぞれ try...except キーワードで表されます。try...except とは別に、別のキーワード、つまり finally を一緒に使用することもできます。

for ループと同様に、これらの trycatch、および 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 ステートメントの下のコードが実行されます。

これは、trycatch、および finally ステートメントを任意の trycatch、および finally ステートメントの下に置くことができることを意味します。例を挙げてこれを理解しましょう。trycatch、および finally ステートメントを含むコードを記述します。これらのステートメントはすべて、その下に trycatch、および 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 ブロックの下のコードが実行されます。

必要に応じてこれをさらに進め、ネストされた trycatch、および finally ステートメントの n レベルを作成することもできます。ただし、ネストされたレベルの数が増えると、制御フローまたは実行フローは少し複雑になり、管理できなくなります。trycatch、および finally ステートメントをナビゲートすることは困難になります。

著者: Vaibhav Vaibhav
Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

関連記事 - Python Statement