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

まずはちょっとおさらいをしてみましょう、
前回、最終的にはこんな例外処理のプログラムになりました。
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:
では特定の例外をキャッチして、処理する場合はどうするのでしょうか。
その場合は起こりうるエラーを知っておく必要があります。
今回、想定するエラーは下の二つです。
- 二つの変数が両方とも文字(str)である
- 少なくとも一つの変数が定義されていない
この場合、どのようなエラーが起こるか確認してみましょう。
二つの変数が両方とも文字(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
ここで重要なのはエラー表示の最初の言葉になります。
- 二つの変数が両方とも文字(str)である = TypeError
- 少なくとも一つの変数が定義されていない = 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回に渡って、例外処理を解説してきました。
ちょっと難しい処理なので、なかなか使用場面をイメージすることができないかもしれません。
こうしている間にも前に導入した温度・湿度ロガーでデータが溜まってきていますし、そろそろ実践的なデータ処理を進めていきたいと思います。

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

ということで今回はこんな感じで。
コメント