[Python] try 〜 exceptによる例外処理

Python 関数

 プログラム実行中に発生した例外(=実行中に検出されたエラー)によってプログラムが途中で終了してしまうのは、よろしくありません。よって、例外が発生したらそれを捕まえて、適切に処理をすることによってプログラムを継続実行させることが必要です。
 Pythonでは、try 〜 except構文を使うことで例外を処理することが出来ます。
 今回はこの構文の使い方の基本についてまとめます。

# 2019/3/31 記事更新

エラーと例外

一般的にエラーと例外の違いについては明確な定義は無いようですが、
Python公式リファレンス 8.エラーと例外
にこれについて記述があります。概要をまとめると、以下のような感じです。

今回のお題であるtry 〜 exception構文では、この例外(exception)を扱っていきます。

try 〜 except文の基本的な使い方

基本的な構文は以下に示す通り、try文とexcept節の組み合わせになります。

try:
    # 処理1

except #例外型 :
    # 処理2

大まかな処理の概要は以下の通りです。

  • 最初にtry節(上記の[処理1])が実行されます。
    • (1-1) [処理1]で例外が発生した場合
      • 残りの処理はスキップされexcept節に移動
        • (2-1) 発生した例外がexcept節の[例外型]と一致した場合
          • except節[処理2]を実行し、その後try節の後ろに移動して処理を継続
        • (2-2) 発生した例外が上記「例外型」と一致しなかった場合
          • 例外はtry文の外側へ渡され、処理されない例外としてメッセージを送出してプログラムの処理が止まります。
    • (1-2) [処理1]で例外が発生しなかった場合
      • except節はスキップされ、次の処理に移動

以下の例は、入力した数値が整数であればそのまま出力、整数でない場合は再度入力を促す動作をする、シンプルなコードです。

while True:
     try:                                           #(1)
         n = int(input())
     except ValueError:                             #(2)
         print('enter again')
     except KeyboardInterrupt:                      #(3)
         print('end')
         break
     else:                                          #(4)
         print('number {}'.format(n))
         break

このコードから分かることは、

  • ひとつのtry節に対しexcept節を複数付けて別々の例外に対応することが可能。
  • else節を設けることが可能で、以下の特徴があります。
    • try節で例外が全く送出されなかった場合に実行される
    • 全てのexcept節の後ろに置かれる

実行結果を以下に示します。

$ python3 try_except.py
a
Enter again     # ValueError送出による例外処理
3.14
Enter again     # ValueError送出による例外処理 
3
number 3        # Try節で例外が送出されなかったのでelse節が実行

$ python3 try_except.py
^CEnd     # KeyboardInterrupt送出による例外処理

まとめ

今回はtry〜except文を用いた例外処理についてまとめました。

Learn more...

書籍でもう少し詳しく学びたい場合はこちらもどうぞ。筆者もかなり参考にさせてもらっています!

シェアする
ひびきをフォローする
Hbk project