Pythonの例外処理(try, except) その2: 特定の例外や複数の例外をキャッチ、例外をスルー

スポンサーリンク

例外処理のおさらい

前回、try-except文を使って、例外処理の基本を解説しました。

Pythonの例外処理(try, except) その1: 基本的な使い方
例外処理とは?今回はPythonで例外処理の方法を解説していきたいと思います。まずは例外処理という言葉は馴染みがないので、言葉の解説から始めていきたいと思います。プログラムを実行した時、起きるのは「正常終了」か「異...

まずはちょっとおさらいをしてみましょう、

前回、最終的にはこんな例外処理のプログラムになりました。

try:
    print(x * y)
except:
    print("Error")
else:
    print("Good")
finally:
    print("Finish")

tryではエラーが発生しそうな処理を書いています。

tryの処理に対して、exceptでエラーが出た場合の処理、elseがエラーが出なかった場合のみ追加で行う処理、finallyでエラーが出ようが出まいが追加で行う処理が書かれています。

今回はこの中でもexceptに関してもう少し詳しく解説を行なっていきます。

ということで今回基本とするプログラムをもう少しスリムにこんな感じにしておきましょう。

try:
    print(x * y)
except:
    print("Error")
スポンサーリンク

全ての例外をキャッチ = except:

これまで解説で使ってきた「except:」という書き方は、どんなエラーだったとして区別なくキャッチします。

前回の解説ではx = “3”、y = “2”として両方とも文字(str)としての数字にすることでエラーを発生させました。

x = "3"
y = "2"

try:
    print(x * y)
except:
    print("Error")

実行結果
Error

例えばtryでの処理 print(x * y)のうち、yを定義していない変数zにしてみましょう。

x = "3"
y = "2"

try:
    print(x * z)
except:
    print("Error")

実行結果
Error

この場合でもtryで書かれた処理 print(x * z)はエラーとなるので、exceptの処理が行われ、Errorが表示されます。

つまり、「except:」として例外処理した場合、どんなエラーだったとしても、エラーが発生した場合、exceptに書かれた処理が行われます。

スポンサーリンク

特定の例外をキャッチ = except XXX:

では特定の例外をキャッチして、処理する場合はどうするのでしょうか。

その場合は起こりうるエラーを知っておく必要があります。

今回、想定するエラーは下の二つです。

  1. 二つの変数が両方とも文字(str)である
  2. 少なくとも一つの変数が定義されていない

この場合、どのようなエラーが起こるか確認してみましょう。

二つの変数が両方とも文字(str)である場合

x = "2"
y = "3"

print(x * y)

実行結果
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-XX-XXXXXXXXXXXX> in <module>
      2 y = "3"
      3 
----> 4 print(x * y)

TypeError: can't multiply sequence by non-int of type 'str'

少なくとも一つの変数が定義されていない

x = "2"
y = "3"

print(x * z)

実行結果
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-XX-XXXXXXXXXXXX> in <module>
      2 y = "3"
      3 
----> 4 print(x * z)

NameError: name 'z' is not defined

ここで重要なのはエラー表示の最初の言葉になります。

  1. 二つの変数が両方とも文字(str)である = TypeError
  2. 少なくとも一つの変数が定義されていない = NameError

これがキャッチする例外の名前になります。

これをexceptの後ろに書くことで、特定の例外をキャッチすることができます。

今回はTypeErrorをキャッチし、Error:Typeと表示させてみましょう。

try:
    print(x * y)
except TypeError:
    print("Error:Type")

「二つの変数が両方とも文字(str)である」エラーの場合、実行結果はこうなります。

x = "3"
y = "2"

try:
    print(x * y)
except TypeError:
    print("Error:Type")

実行結果
Error:Type

ではキャッチすると定義されていないエラー(今回の場合、「少なくとも一つの変数が定義されていない」エラー)ではどうなるでしょうか。

x = "3"
y = "2"

try:
    print(x * z)
except TypeError:
    print("Error:Type")

実行結果
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-XX-XXXXXXXXXXXX> in <module>
      3 
      4 try:
----> 5     print(x * z)
      6 except TypeError:
      7     print("Error:Type")

NameError: name 'z' is not defined

「少なくとも一つの変数が定義されていない」エラーは定義されていないため、キャッチできず通常のエラーとして処理され、プログラムが異常終了してしまいました。

スポンサーリンク

複数の例外をキャッチ

特定の例外がキャッチできるようになると、複数の例外を別々にキャッチできるようになります。

ということでTypeErrorをキャッチし、Error:Typeと表示させたうえで、他のエラーは全てひとまとめにキャッチし、Errorと表示させてみましょう。

try:
    print(x * z)
except TypeError:
    print("Error:Type")
except:
    print("Error")

このプログラムでTypeError(「二つの変数が両方とも文字(str)である」エラー)を発生させるとこうなります。

x = "3"
y = "2"

try:
    print(x * y)
except TypeError:
    print("Error:Type")
except:
    print("Error")

実行結果
Error:Type

except TypeError: でエラーをキャッチして、Error:Typeが表示されています。

またその他のエラー(NameError: 「少なくとも一つの変数が定義されていない」エラー)の場合はこうなります。

x = "3"
y = "2"

try:
    print(x * z)
except TypeError:
    print("Error:Type")
except:
    print("Error")

実行結果
Error

今度はexcept:でキャッチしているため、Errorが表示されています。

今回は一つを特定の例外をキャッチし、もう一つを例外全てをキャッチしていますが、複数の特定の例外をキャッチすることも可能です。

try:
    print(x * z)
except TypeError:
    print("Error:Type")
except NameError:
    print("Error:Name")

こうすることにより、TypeErrorの場合はError:Typeと表示され、NameErrorの場合はError:Nameと表示されます。

スポンサーリンク

例外をキャッチするがスルーする = pass

例外をキャッチするが、特に何もしない場合には「pass」を使います。

x = "3"
y = "2"

try:
    print(x * y)
except TypeError:
    pass

実行結果

この場合、except TypeError: でTypeError(二つの変数が両方とも文字(str)である)をキャッチしているのですが、処理に「pass」としているため、何もせず処理が終了しています。

そのため、実行結果には何も表示されません。

ということで2回に渡って、例外処理を解説してきました。

ちょっと難しい処理なので、なかなか使用場面をイメージすることができないかもしれません。

こうしている間にも前に導入した温度・湿度ロガーでデータが溜まってきていますし、そろそろ実践的なデータ処理を進めていきたいと思います。

温度・湿度ロガーで温度を自動測定・記録してみる Inkbird IBS-TH1 PLUS その1
Inkbird IBS-TH1 PLUS今回は温度・湿度計+ロガーのInkbird IBS-TH1 PLUSの紹介です。購入した経緯としては、そろそろPython関係の記事を増やしたい。特にデータ解析の記事...

その際になるべくこの例外処理を使って、色々試していくことにしましょう。

ということで今回はこんな感じで。

コメント

タイトルとURLをコピーしました