無題のプレゼンテーション__2_

Pythonの勉強するよ【例外処理編】

どもども。
前回は、スコープについて勉強していきました。

【前回の復習】
・変数には2つのスコープがあり、ローカルスコープとグローバルスコープを呼ばれる。
・ローカルスコープで代入された変数をローカル変数といい、グローバルスコープで代入された変数をグローバル変数という。
・ローカルスコープでグローバル変数に値を代入したい場合は、global文を使用する。
・変数がローカル変数なのか、グローバル変数なのかを見分けるルールがある。

今回は、例外処理について勉強していきます。

3.7 例外処理ってなに?

そもそも例外処理ってなんぞ?って人に簡単に説明します。プログラムは例外(Error)が発生すると異常終了しちゃうんですよ。実際に見てみると、下のような感じです。

def division(x, y):
   return x / y

print(division(1, 2))
print(division(3, 0))
print(division(2, 4))
【実行結果】
0.5
Traceback (most recent call last):
File ".\test.py", line 5, in <module>
print(division(3, 0))
File ".\test.py", line 2, in division
return x / y
ZeroDivisionError: division by zero

上の例の場合だと、ゼロ除算をしようとしているため、エラーが発生しています。ここで注目してほしいのは、print(division(2, 4))が実行されていないということです。これは、ゼロ除算をしようとしてZeroDivisionErrorが発生したので、アプリが異常終了したため、print(division(2, 4))まで処理がいかなかったためです。
でもエラーが発生しても処理を継続したい場合はたくさんあるんですよ。例えば、Gmailのようなメールソフトを想像してください。通信状態が悪くてメールの送信が失敗したからと言って、いちいちアプリが落ちるなんてことないですよね?
このように例外が発生しても特定の処理を実行したい場合に使用するのが例外処理です。

3.7.1 例外処理の使い方

では例外処理の使い方を説明していきます。

【例外処理の書き方】
try:
    実行したいコードブロック
except:
    エラーが発生した場合に実行したいコードブロック

例外処理を使うには、try-except文を使用します。Javaなど他の言語ではtry-catch文ですが、Pythonではtry-exceptなので注意しましょう。実際に使用するとこうなります。

try:
   a = 2 / 0
   print('no print')
except:
   print('error!!!!')
【実行結果】
error!!!!

try-except文では、try文の中のコードブロックに例外が発生するかもしれないコードを、except文のコードブロックの中に例外が発生した場合に実行するコードを記載します。
上の例の場合、2/0を実行すると、ZeroDivisionErrorが発生するので、except文のコードブロックが実行されます。
ここで気を付けてほしいのは、try文で例外が発生した場合、try文のそれ以降のコードは実行されないということです。上記の例でも、print('no print')は実行されていません。
また、try文内で実行した関数で例外が発生した場合も同様にexcept文で例外をキャッチできる、ということも覚えておきましょう。

def div(a, b):
   return a / b
try:
  print(div(2, 0))
except:
  print('error!!!!')
【実行結果】
error!!!!
【Point】
・例外処理は、下の書き方で実装できる。
try:
    例外が発生するかもしれないコード 
except:
    例外が発生した場合に実行したいコード
・例外が発生すると、try文のそれ以降のコードは実行されない
・try文内で実行した関数で例外が発生した場合も同様にexcept文で例外をキャッチできる

3.7.2 特定の例外だけキャッチする

お気づきになられた方もいるかもしれませんが、先ほどの例の場合、try文の中で複数の例外が発生しうる場合、例外が発生したことはわかっても、何の例外が発生したかはわかりません。

try:
   x = int(input("Please enter a number: "))
   print(2/x)
except:
   print('error!!!!')
【実行結果】
Please enter a number: 0
error!!!!
Please enter a number: a
error!!!!

例えば、上の例の場合、0を入力すると、ZeroDivisionErrorが発生しますが、数字以外を入力すると、ValueErrorが発生します。しかし、ログ上は、error!!!!としか表示されていないため、実際に何の例外が発生したのかわからなくなってしまいます。
そこで使用するのが、下の文です。

【特定の例外をキャッチする】
try:
    実行したいコードブロック
except exceptiontype as name:
    例外が発生した場合に実行したいコードブロック

先ほどとの違いは、except文の後ろで、exceptiontypeを指定しているところです。exceptiontypeには、例外クラスを指定します。実際に使ってみましょう。

try:
  x = int(input("Please enter a number: "))
  print(2/x)
except ZeroDivisionError as e:
  print('ZeroDivisionError !!!!',e)
except ValueError as e:
  print('ValueError !!!!',e)
【実行結果】
Please enter a number: 0
ZeroDivisionError !!!! division by zero
Please enter a number: a
ValueError !!!! invalid literal for int() with base 10: 'a'

このように、except文に書いた例外によって、処理を分岐することができます。

【Point】
特定の例外をキャッチする処理は、下の書き方で実装できる。
try:
    実行したいコードブロック
except exceptiontype as name:
    例外が発生した場合に実行したいコードブロック

まとめ

いかがでしたか?今回は短かったですが、例外処理はプログラムを作成するうえで、非常に重要になります。

【まとめ】
・例外処理は、下の書き方で実装できる。
try:
    例外が発生するかもしれないコード 
except:
    例外が発生した場合に実行したいコード
・例外が発生すると、try文のそれ以降のコードは実行されない
・try文内で実行した関数で例外が発生した場合も同様にexcept文で例外をキャッチできる
・特定の例外をキャッチしたい場合は、except文を
except exceptiontype as name:
という書き方にする。

次回からは、リストについて勉強していきます。ではでは。

P.S.
ボルダリングで初めて5級を登れました。

この記事が気に入ったらサポートをしてみませんか?