【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に移行してくれる
  • メインの処理とエラーの処理を分離して考えることができるようになる

気を付けるべきポイント

  1. 例外を扱うのは誰なのかを考える
  2. 例外の握りつぶしをしない
  3. 対応する例外はできるかぎり限定する
  4. 例外を分岐に使わない

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('文字列で割ることはできません')

# 文字列で割ることはできません

デモ用サンプルコード

GitHub - babylon-tech/python_exception_sample

Contribute to babylon-tech/python_exception_sample development by creating an account on GitHub.