[Python3] try except else finally


例外処理


Python 3は、try except構文を使用して異常を処理することができる.
似たような文法を持つ言語もたくさんあります.
Java、JavaScript、C++、phpなどの言語はtry catch文法をサポートしています.
Python 3のtry except finallyは、他の言語のtry catch finallyとほぼ同じです.
sample = {"key1": 1}
try:
    value2 = sample["key2"]
    print("try here")
except KeyError:
    value2 = 0
    print("Error!")
finally:
    print("FINALLY!")

print("After handler")
#出力
Error!
FINALLY!
After handler
Python 3のtry except finallyはこのような構造である.
簡単です.
  • try文からsample辞書に存在しない鍵にアクセスします.
  • KeyErrorが発生したので、KeyErrorを制御するexceptゲートに移動した.

  • その後、最後にfinally文を実行し、プロセスを続行します.
  • しかし、他の言語とは異なる機能もあります.

    差異

    elseゲートです.
    △Pythonではelseゲートがあちこちで使われているようです.先週、forゲートもelseゲートが使えることを知りましたが...)
    sample = {"key1": 1}
    try:
        value1 = sample["key1"]
        print("try here")
    except KeyError:
        value2 = 0
        print("Error!")
    else:
        print("value2 assigned!")
    finally:
        print("FINALLY!")
    
    print("After handler")
    #出力
    try here!
    value2 assigned!
    FINALLY!
    After handler
    コードを少し修正しました.elseゲートはtryゲートでエラーが発生しましたが、例外が発生しない場合にのみアクセスできます.
    しかし、elseドアはexceptドアがないわけにはいかない.
    try:
        print("hello")
    else:
        print("world")
    そうは書けないtry exceptゲートを処理すればいいのに、なぜelseゲートがあるのですか?

    what 'else'??


    1.可読性、明確性


    水道コードを作ります.get_data()という関数にデータをインポートします.
    これは,parse()という関数で導入されたデータをグループ化する作業である.
    この場合、get_data()関数に異常が発生する可能性があると仮定します.
    try:
        my_data = get_data()
        parsed_data = parse(my_data)
    except:
        parsed_data = None
    
    return parsed_data
    さらにelse句を加えます.
    try:
        my_data = get_data()
    except:
        parsed_data = None
    else:
        parsed_data = parse(my_data)
    
    return parsed_data
    elseゲートは、どのような態様で例外処理を行うべきかを明確に知ることができる.

    2.意図的に異常処理を行わない


    Python3 tutorial - Exception handlingを参照してください.
    The use of the else clause is better than adding additional code to the try clause because it avoids accidentally catching an exception that wasn’t raised by the code being protected by the try … except statement.
    先ほどのサンプルコードを再利用しましょう.
    しかし、ここでは、get_data()parse()の両方の関数がIOErrorを生成できると仮定する.
    try:
        my_data = get_data()
        parsed_data = parse(my_data)
    except IOError:
        parsed_data = None
    
    return parsed_data
    get_data()およびparse()で起こり得るIOErrorを処理することができる.parse()で発生した例外を処理したくないなら?
    その時はelseを使います.
    try:
        my_data = get_data()
    except IOError:
        parsed_data = None
    else:
        parsed_data = parse(my_data)
    
    return parsed_data
    次のように、parsed_data = parse(my_data)を異常処理文から直接取り出せばいいのではないでしょうか.
    try:
        my_data = get_data()
    except IOError:
        parsed_data = None
        
    parsed_data = parse(my_data)
    return parsed_data
    異常が発生した場合、my_dataは未定義の名前であるため、NameErrorが発生する.