2023/10/02 (月) start 2023/10/05 (木) done

Python try_except_else

故意にエラーを出してみる。


n = 1 + a
Traceback (most recent call last):
  File "", line 1, in 
    n = 1 + a
NameError: name 'a' is not defined

エラーメッセージをトレースバックと言う。英語での表記であるから、慣れないユーザーは困惑するだけである。こういったエラー表示をコーディングしている者が分り易くユーザーへ通知することは有意味である。
ここでのエラーはNameErrorというもので、具体的なエラー内容は変数aの定義が行われていないことを伝えている。参考書の著者によると、このようなエラーのあるコードを悪意のある者が攻撃に利用することが可能であると注意を促している。 そういうことを踏まえて、このようなエラーを予め予期し、装備するのが例外処理であり、try-except-elseの構造を持ったコードを利用する。 これにより、コードは悪意のないユーザーのミスや悪意のある攻撃に対して耐性があるものになると言う。
tryがpythonの実行部分であり、エラーが予期されるコードであればこれを使う。exceptはtryでの実行部分が失敗したた場合、具体的なエラー説明をユーザーへ通知する。elseはtryのコードブロックが実行されたあとの命令となる。上の失敗コードをtry-exceptで示すと、

try:
    n = 1 + a
except NameError:
    print("変数aが定義されていません。")
 
#実行結果
変数aが定義されていません。

これを受けて、例えばユーザーは、
a = []
a.append(2)
n = 1 + a[0]
print(n)
3

のようなコードとでもするだろう。はたまた、ユーザーが面白半分に文字列を変数に入れて遊ぶかもしれない。以下のコードでは、 ValueErrorが予期されるコードである。シチュエーションを観察しよう。

print("終了するには半角英字finを入力してください。")

while True:
    a = input("任意の数字キーを押下してください。:")
    if a == 'fin':
        print("終了します。\n")
        break

    try:
        n = "{:_}".format(int(a)**2)

    except ValueError:
        print("指定の文字列以外は実行不能です。数字を入力して下さい。")

    else:
        print(n)

#実行出力
終了するには半角英字finを入力してください。
任意の数字キーを押下してください。:689756324035
475_763_786_546_275_918_681_225

ここでユーザーが面白半分に、
任意の数字キーを押下してください。:秋
指定の文字列以外は実行不能です。数字を入力して下さい。
任意の数字キーを押下してください。:fin
終了します。

となる。
▲ トップへ戻る


戻る
カテゴリー