Python/例外処理

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

try文とexcept文[編集]

try と except のある構文を用いて、例外が発生した時の処理を記述できる。

try:
    例外の発生する可能性のある処理
except:
    例外発生時に行う処理

例外の起きそうな処理を、tryブロックに書く。tryブロック内で数値を0で割るなどの処理が発生すると、エラーとして認識され、exceptブロックの処理にうつり、exceptブロック内の処理が行われる。

try:
    print("3を入力した整数aで割るプログラム。")
    x=int(input())
    a=3/x
    print(a)
except:
    print("エラーが発生しました。")

上記のプログラムでは、もし0で割るなどの例外が発生すると、except文ブロックにある処理が実行されるので、文「エラーが発生しました。」が表示される。また、print(a)が実行されるよりも先にエラーが発生するため、先にexceptブロックに処理が移るので、計算結果の3/aは表示されない。

なお、もし正常に数値を入力するなどして、例外が発生しなければ、けっして「エラーが発生しました。」は表示されずに、3/aの計算結果が表示される。

たとえば、入力の数値として、数「2」を入力すると、3/2の計算結果である「1.5」が表示され、そのままプログラムが終わる。


なお、tryブロックの外で例外が発生しても、exceptには処理は移動せずに、プログラムのエラーにより終了する。

print("3を入力した整数aで割るプログラム。")
x=int(input())
a=3/x

try:
    print(a)
except:
    print("エラーが発生しました。")

たとえば、上記のプログラムで、「0」を入力すると、けっして「エラーが発生しました。」は表示されない。0を入力してエンターキーを押した直後に、コンパイラによりエラーメッセージ「ZeroDivisionError: division by zero」などの文が表示され、そしてプログラムは終了する。


finally文[編集]

finallyブロックの処理は、例外が発生しても発生しなくても、どちらの場合にも、さいごに行われる処理である。

try:
    print("3を入力した整数aで割るプログラム。")
    x=int(input())
    a=3/x
    print(a)
except:
    print("エラーが発生しました。")
finally:
    print("計算を終了します。")

たとえば、プログラムにエラーが発生しても、発生しなくても、どちらにせよ、プログラムを終了する必要のある場合が多いので、そのような処理が、finallyブロック内に書かれることが多い。


例外の場合わけ[編集]

pythonの例外処理では、生じた例外の種類に応じての場合わけも、できます。

try:
    例外の発生する可能性のある処理
except 例外の種類A:
    例外発生時に行う処理
except 例外の種類B:
    例外発生時に行う処理

のように、生じた例外の種類におうじて、exceptのあとに、例外の種類ごとに定められたキーワードを記述して、例外の種類を指定します。


「ゼロで割り算できない」という例外の場合は 「ZeroDivisionError」というキーワードを、exceptの直後に記述することにより、例外の種類を指定します。

よって、この部分のコード記述は、

except ZeroDivisionError :

のようになります。


ほかにも、例外の種類は、あります。例外の種類が、型(かた)についてのエラーの場合には「ValueErorr」というキーワードを、exceptの直後に記述することにより、例外の種類を指定します。なお、「型」とは、「整数型」とか「文字列型」とかのことです。

つまり、この場合の、この部分のコード記述は、

except ValueError :

のようになります。


まとめると、

try:
    例外の発生する可能性のある処理
except ZeroDivisionError :
    ゼロで割り算したことによる例外発生の時に行う処理
except ValueError :
    型のミスによる例外発生の時に行う処理

のようになります。

なお、エラーを種類を指定するキーワードは、上記のZeroDivisionError や ValueError の他にも、たくさん、あります。