理由はそのうち考える

まずやってみよう

Python学習メモ:例外処理

gihyo.jp

例外処理

Pythonにも例外処理がある。構文は以下の通り。

try:
    処理
except 捕捉したい例外クラス:
    期待する例外が発生した時に実行される処理
else:
    例外が発生しなかったときのみ実行される処理
finally:
    例外の発生有無にかかわらず実行したい処理

except節

指定した例外クラスを捕捉する。複数の例外を捕捉したい場合はカンマで区切るか複数のexcept節を記述する。その場合、最初にマッチしたexceptが実行されるので例外クラスを自作している場合などは記述する順にも気を配る必要がある。
キーワード as をつけると、except節内で例外オブジェクトを利用できる。

def printList(index):
    items = [“hoge”, “piyo”, “fuga”]
    try:
        print(items[index])
    except IndexError as e:
        print(f’catch exception : {e}’)

>>> printList(3)
catch exception : list index out of range

exceptにマッチしない場合は、その例外の一つ外側のスコープに再送出される。 exceptに何も指定しない場合はすべての例外を捕捉できるが、敢えて例外を送出させてプログラムを終了させたいものでも捕捉してしまい、 意図せぬ動きをしてしまうことがあるため、基本的には捕捉したい例外のみを指定する。

最後の except 節では例外名を省いて、ワイルドカード (wildcard、総称記号) にすることができます。 ワイルドカードの except 節は非常に注意して使ってください。というのは、ワイルドカードは通常のプログラムエラーを たやすく隠してしまうからです!

エラーと例外 — Python 3.8.5 ドキュメント より引用

else節

exceptがある場合のみ利用でき、例外が発生しなかった場合のみ実行される処理を記述する。 例外が発生しないとき=正常終了時に実行したい処理ということになる。

finally節

C#のfinallyと同じ。tryを抜ける際に例外の発生有無にかかわらず実行される。

独自の例外クラス

基底クラスのExceptionを継承することで、新しい例外を定義できる。 ユーザー定義クラスと対にして使用するとエラーの範囲が特定できる。

raise文

C++C#のthrowにあたる。意図的に例外を送出させる。

raise ValueError(‘不正な引数’)

with文

定義済みのクリーンアップ処理を必ず実行する。構文は以下の通り。

with 対応したオブジェクト as 変数:
    処理

例えばファイルクローズなど。以下のようにしておけば、closeしなくてもwithのブロックを抜けた後で常にクローズされる。

with open("myfile.txt") as f:
    for line in f:
        print(line, end="")

参考:8. エラーと例外 — Python 3.8.5 ドキュメント