この記事は下記のような方におすすめです。
- 例外処理とは何なのか知りたい
- 例外処理の書き方がわからない
- openpyxlで例外処理をする方法を知りたい
この記事を読んでわかること。
- 例外処理の概要がわかる
- 例外処理を使う理由やメリット・デメリットがわかる
- 例外処理の実践例がわかる
できるだけわかりやすく解説いたします。
【著者情報】
Python歴3年。
入社2年目の春に先輩が突然トンズラし、業務を半分肩代わりするハメに…。
今までの1.5倍の仕事をこなせるはずもなく、苦しむ毎日。
業務効率化を模索中にPythonと出合う。
業務とPythonの相性が良く、2倍以上の効率化を実現。現在も効率化を進行中。
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
例外処理とは
例外処理は、簡単に説明すると「エラーを出さないようにする処理」のことです。
厳密に言うと、内部的にはエラーが発生しているのですが、それを表示させないようにする処理といった具合でしょうか。
え?エラーが発生しているのに表示させないと、
困ることもあるんじゃないの?
そうなんです。
しかし使う理由があります。具体例を交えながら、次項で説明いたしましょう。
例外処理を使う理由
1~5までの5つの処理をさせたくて、「1・2・3・4・5」とプログラムを書いたとします。
このとき、2つめでエラーが発生してしまうと、2以降のプログラムは処理されず、異常終了されてしまいます。
もう少しわかりやすくしてみましょう。
朝起きてからのルーティンを決めたとします。
- 顔を洗う
- トイレに行く
- 朝ごはんを食べる
- 歯を磨く
- 家を出る
2つ目の「トイレに行く」で誰かがトイレに入っていたら、トイレに行けずエラーになります。
プログラミングの世界では、ここで止まってしまって家を出ることができません。
「3.ごはんが炊けてなかったら」「4.歯ブラシが無かったら」という場合も同じです。
しかし例外処理は、何らかのエラーが発生しても処理を止めず、最後まで完了させることができるのです。
上の例では、「誰かがトイレに入っていたらトイレに行かない」、「ごはんが炊けてなかったらパンを食べる」など、スキップしたり、別の処理をさせたりできます。
if文のエラー版といったところでしょうか…。
<例外処理を使わなかった場合>
- 顔を洗う:正常終了
- トイレに行く:エラー発生 できない
- 朝ごはんを食べる:できない
- 歯を磨く:できない
- 家を出る:できない
<例外処理を使った場合>
- 顔を洗う:正常終了
- トイレに行く:エラー発生(スキップ)
- 朝ごはんを食べる:正常終了
- 歯を磨く:正常終了
- 家を出る:正常終了 いってきます!
例外処理のメリット・デメリット
前項で少し触れたものもありますが、メリット・デメリットをまとめてみました。
<メリット>
- エラー表示が出にくくなる
- プログラムを最後まで処理できる可能性が高まる
- プログラムの再実行が減る(時間がかかる場合は尚良し)
<デメリット>
- エラーが出たのか正常終了したのかがわかりにくい
- 処理がスキップされる場合があるため、予想外の結果になることがある
- コードが増えるため、少し複雑になりやすい
一長一短といったところでしょうか…。
では、例外処理の書き方について解説していきましょう。
例外処理の簡単な使い方・書き方
まずは簡単な例とテンプレを紹介します。
エラーが発生したら、画面に「できません」と表示させる例です。
try:
a = 1
b = 'あ'
print(a+b)
except:
print('できません')
実行結果:できません
変数aとbは型が違うため、通常であればTypeエラーが表示されます。
しかし例外処理のおかげでエラーは表示されず、「できません」が表示されました。
変数については下記記事をご参考ください。
<テンプレ>
try:
「させたい処理」
except:
「させたい処理」の中でエラーが発生した場合の対処法
else:
エラーが発生しなかった場合の処理
else以降は無くても大丈夫です。
今回の例でも使用していません。
では次に、openpyxlで使う場合の実践例を見てみましょう。
openpyxlで例外処理[実践例]
openpyxlを使ったことがある人なら一度は見たことある「KeyError」
今回は、その「KeyError」を表示させないような実践例を用意してみました。
▼開くファイル(input.xlsx)
import openpyxl
try:
wb = openpyxl.load_workbook('input.xlsx')
ws = wb['Sheet999']
ws['A1'] = 1
wb.save('input.xlsx')
except KeyError:
ws = wb.worksheets[0]
ws['A1'] = 1
wb.save('input.xlsx')
print('「Sheet999」が見つからなかったため、シート番号0を開きました')
上記コードの通常処理は以下の通りです。
- ワークブックを開く
- Sheet999を開く
- A1に1を記入する
- 保存する
Sheet999は存在しないため、通常であれば「KeyError」が発生します。
しかし、例外処理のおかげで「KeyError」は表示されず、
「except KeyError:」で書いた「シート番号を指定」して処理が進みます。
ん?なんか付け加えられてる…。
さっきは「except」だけだったよね?
そうなんです。
「except」の後にエラー名を付け加えることで、対象のエラーが発生した場合の処理を指定できます。
今回の場合は、「KeyError」が発生した場合はシート番号を指定して続行されるので、
「PermissionError」が発生した場合は続行せず、エラーが表示されて中断します。
複数のエラー対策をすることも可能です。
try:
「させたい処理」
except KeyError:
「KeyError」が発生した場合の対処法
except PermissionError:
「PermissionError」が発生した場合の対処法
このように、発生しそうなエラーを指定して別の処理を書くことで、
中断する可能性が減るとともに、思い通りの処理を実行させる可能性が高まります。
しかしながら、意図しない結果になる可能性は残ります。
今回の例では「シート番号0」に既に数値が入っているなど、「処理対象のシートではなかった」場合、
異常な結果になる場合がありますので注意が必要です。
openpyxlでよく出るエラー
openpyxlを使う際によく出るエラーをまとめました。ご参考ください。
- FileNotFountError:ファイルが見つからない場合のエラー
- PermissionError:ファイルが開かれているため保存できない場合のエラー
- KeyError:シート名などが見つからない場合のエラー
- NameError:変数名などが見つからない場合のエラー
- IndexError:シート番号などが見つからない場合のエラー
最後に
openpyxlの例外処理について解説いたしました。
スマートにエラーを回避して、さらなる業務効率アップを目指しましょう!
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!