【Python独学】try~except文による例外処理の基本
プログラム実行時のエラー(例外:exception)に対処するためのコードを組み込んだtry文~except文について、今回はその基本を紹介します。
エラーとは
コードを書いて、いざ実行しようとすると・・・エラーが発生してしまうことがあります。
例えば、こんな感じです。
a = 1 b = 0 print(a/b)
Traceback (most recent call last):
File “C:\Python> python 5-1-1.py”, line 3, in <module>
print(a/b)
ZeroDivisionError: division by zero
これは、ある数字(今回の例は1)を0で割ろうとしたために発生してしまった”ZeroDivisionError”というエラーです。
ある数字を0で割る、いわゆる『ゼロ除算』というのは、数学的に計算が成立しないのでエラーという扱いになります。
例えば電卓で同じことやろうとすると、”エラー(Error)”や”Infinity”等の文字が表示されてしまった、という経験をされた方もいるかと思います。
エラーはたくさんの種類が存在しますが、まずは、大きくは次の2種類に分かれます。
(1)構文エラー(syntax error)
プログラムの構文がそもそも間違っている(つまりコンピュータが命令を理解できない)ために実行出来ないというエラー【例】
・for文でコロン(:)が抜けている
⇒SyntaxError: invalid syntax
・print()関数で、括弧閉じを忘れている
⇒SyntaxError: unexpected EOF while parsing
・文字列以外の場所に全角スペースが入ってしまっている
⇒SyntaxError: invalid character in identifier
(2)例外 (exception)
プログラムの構文はあっているが処理が出来ずに異常終了となってしまうエラー
【例】
・数字の0で除算をしてしまう
⇒ZeroDivisionError: division by zero
・値を初期化していない変数で演算を行う
⇒NameError: name ‘変数名’ is not defined
・if文やfor文でインデントを入れていない
⇒IndentationError: expected an indented block
try~except文
上述したゼロ除算などの例外(exception)について、プログラム実行時に例外が発生してしまう可能性が予見できたとします。
『『『もしかしたら、処理の途中でゼロ除算が発生してしまうかも!!』』』
そのような場合には、try~except文を使用しておくことで、もし例外が発生してもプログラムは異常終了させることなく、対応処理を実行することが出来ます。
以下が、try~except文の書き方になります。
try: 例外(exception)が発生する恐れのある処理 ・・・ except: 例外(exception)が発生したら実行する処理 ・・・
それでは、try~except文を使用した処理の例を見ていきましょう。
次の例は、入力された数字の値の大きさによって、出力する文字を変更するプログラムです。
※まだtry~except文は使っていません。
お酒を購入する前の年齢確認を想像してみてください。
question = "年齢確認です。あなたの年齢を数字で入力してください:" input_value = input(question) if 20 <= int(input_value) : #inputで入力された数字は文字列型となるため、int型にして比較する print("20歳以上なので問題ありません。") else : print("お酒は20歳からです。")
C:\Python> python 5-1-2.py
年齢確認です。あなたの年齢を数字で入力してください:30
20歳以上なので問題ありません。
C:\Python> python 5-1-2.py
年齢確認です。あなたの年齢を数字で入力してください:10
お酒は20歳からです。
なお、input()で入力された数字は文字列型の扱いになるため、プログラム3行目でint()で整数値への型変換を行っています。
ここで、入力を『30』ではなく『30歳』としたとします。
すると、次のような例外が発生してしまいます。
ValueError: invalid literal for int() with base 10: ’30歳’
これは、int()での整数値への型変換の際に、『30歳』を整数値へ変換出来なかったためです。
※数字ではない文字(漢字)が含まれてしまっているためです。
そこで、今度は『30歳』と入力されても、プログラムが異常終了とならないようにします。
question = "年齢確認です。あなたの年齢を数字で入力してください:" input_value = input(question) try : #tryブロックに例外が発生する恐れのある処理を記述 if 20 <= int(input_value) : #input(question)で入力された値は文字列扱いとなるため、数値ansをstr型にして比較 print("20歳以上なので問題ありません。") else : print("お酒は20歳からです。") except : #exceptブロックに例外が発生したら実行する処理を記述する print("漢字を含めず、数字のみを入力してください")
年齢確認です。あなたの年齢を数字で入力してください:30歳
漢字を含めず、数字のみを入力してください
int()で整数値へ変換する際に例外が発生する恐れがあるので、その部分をtryブロック内に含めて実行します。
そして、例外が発生した場合は、exceptブロック内の処理が実行されます。
これで、例外によってプログラムが異常終了することはなくなりました。
ただしこのままでは、『30歳』と入力してしまった場合には注意喚起されるだけで再入力が出来ないので、while文を使用して再入力出来るようにします。
while True: #while文で繰り返し入力出来るようにする question = "年齢確認です。あなたの年齢を数字で入力してください:" input_value = input(question) try : if 20 <= int(input_value) : print("20歳以上なので問題ありません。") else : print("お酒は20歳からです。") break except : print("漢字を含めず、数字のみを入力してください")
年齢確認です。あなたの年齢を数字で入力してください:30歳
漢字を含めず、数字のみを入力してください
年齢確認です。あなたの年齢を数字で入力してください:30
20歳以上なので問題ありません。
いかがでしたでしょうか。
以上が、例外が発生する恐れのある場合に使用するtry~except文の基本的な使い方の一例でした。
まとめ
エラーには、構文エラー(syntax error) と例外 (exception) があります。
例外とはプログラムの構文はあっているが処理が出来ずに異常終了となってしまうエラーであり、try~except文を使用することで、もし例外が発生してもプログラムは異常終了させることなく対応処理を実行することが出来ます。
確認問題
以下二つのプログラムは、ゼロでの割り算を実行します。
どのような出力となるか、比べてみましょう。
a = 1 b = 0 c = a / b print(c)
a = 1 b = 0 try : c = a / b print(c) except : print("何らかのエラーが発生しました")
※解答 以下のような動作になります。
プログラム1:エラーが発生します(ZeroDivisionError: division by zero)
プログラム2:exceptブロック内の処理が実行され『何らかのエラーが発生しました』と表示されます