例外処理:実行時エラーを避ける

詳しくはPython3 ドキュメント/Pythonチュートリアル/エラーと例外を参照.

次のプログラム cat2.py を実行させてみよう。 コマンドラインで指定されたファイル sys.argv[1] をRead Onlyで開いて一行づつ読んで改行文字を剥ぎ取って変数lineに格納して標準出力に書き出す。

import sys

fp = open(sys.argv[1], 'r')
line = fp.readline()
while line:
    print(line, end="")# print後に改行しないPython3の書き方
    line = fp.readline()
fp.close

プログラム構文上の誤りがなくても、実行不可能な処理が記述されていて処理を進めることができなくなってプログラム実行が中断されることを実行時エラーという。 この場合、コマンドラインで指定した(場所にある)開くべきファイル mytext.txt が存在しないときには次のようなエラーメッセージを出力してプログラムの実行が停止する。

$ python cat2.py myfile.txt
Traceback (most recent call last):
  File "cat2.py", line 3, in 
    fp = open(sys.argv[1], 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'myfile.txt'

例外の検出

Pythinでは、特定の条件の元で実行を失敗し得る例外コードを実行させたときに生じる可能性のあるエラーをキャッチし、例外処理を記述することができる。

例外のキャッチとその対応は次の構文で記述する。 例外タイプは正しく記述するものとし、分岐if-elif-elseと同様に複数の例外処理を記述できる。 最後の cxcept: のように例外タイプが指定ないとき、「すべての」例外とみなされる。 例外発生の原因を掴みやすいように、発生し得る例外タイプごとに処理を記述することが望ましい。

try:
    例外発生があり得るコード
    例外発生があり得るコード
    ....
except 例外タイプ:
    例外発生時の処理
    ....
except 例外タイプ:
        例外発生時の処理
    ....
except:
    以上の例外発生時の処理
    ....
else:
    例外が発生しないときの処理

たとえば、先の cat2.py は次のように例外処理を加えて修正できる。 例外処理 except 内にある sys.exit() は、実行しているプログラムの中でメインプロセスを終了させる。 以下の例では、引数に与えた'Error'を出力してプログラムを終了させている。

import sys

try:
    fp = open(sys.argv[1], 'r')
except FileNotFoundError:
    print('!!! FileNotFoundError !!!')
    print('The file [' + sys.argv[1] + ']  is not found.')
    sys.exit('Error')
line = fp.readline()
while line:
    print(line, end="")# print後に改行しないPython3の書き方
    line = fp.readline()
fp.close