【Python】脱初心者のための例外処理(try~except)の扱い方
本記事は2024年4月21日に開催された「【オンライン】飛騨高山Pythonの会 #51」での発表内容をまとめたものになります。ご参加いただいた皆様ありがとうございました。月1回の頻度で開催しておりますので、今回ご参加いただけなかった方のご参加をお待ちしております!
📖 参照: 日経ソフトウェア2022年1月号
例外処理の価値
例外処理がない場合の抽象的なコード(C言語やGo言語などには例外の機能がありません)
返り値1, エラー1 = 関数1()
if ( エラー1があったら ) {
エラー処理1
return
}
返り値2, エラー2 = 関数2()
if ( エラー2があったら ) {
エラー処理2
return
}
- メインの処理とエラーの処理が混在している
- 関数1でエラーがあった場合は、関数2を実行することはできないため、いちいちエラーの有無をチェックする必要がある
- 関数側もきちんとエラー情報を返す必要がある
例外処理を使った場合の抽象的なコード
try {
関数1()
関数2()
} catch(エラー1) {
エラー処理1
} catch(エラー2) {
エラー処理2
}
- メインの処理の部分でエラーを一切意識する必要がない
- 関数1でエラーがあった場合、言語処理系が関数2の呼び出しを実行せずに、エラー処理1に移行してくれる
- メインの処理とエラーの処理を分離して考えることができるようになる
気を付けるべきポイント
- 例外を扱うのは誰なのかを考える
- 例外の握りつぶしをしない
- 対応する例外はできるかぎり限定する
- 例外を分岐に使わない
Pythonの例外処理
例外を発生させる
num = 10 / 0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
try-exceptのサンプルコード
try:
num = 10 / 0
print(f'除算の結果は {num} になります')
except ZeroDivisionError:
print('0で割ることはできません')
# 0で割ることはできません
複数の例外で処理を分けるサンプルコード
try:
num = 10 / '2'
print(f'除算の結果は {num} になります')
except ZeroDivisionError:
print('0で割ることはできません')
except TypeError:
print('文字列で割ることはできません')
# 文字列で割ることはできません
デモ用サンプルコード