【エラー完全回避!】openpyxlで例外処理[Python]

スポンサードリンク
アイキャッチ Python

この記事は下記のような方におすすめです。

  • 例外処理とは何なのか知りたい
  • 例外処理の書き方がわからない
  • openpyxlで例外処理をする方法を知りたい

この記事を読んでわかること。

  • 例外処理の概要がわかる
  • 例外処理を使う理由やメリット・デメリットがわかる
  • 例外処理の実践例がわかる

できるだけわかりやすく解説いたします。

【著者情報】
Python歴3年。
入社2年目の春に先輩が突然トンズラし、業務を半分肩代わりするハメに…。
今までの1.5倍の仕事をこなせるはずもなく、苦しむ毎日。
業務効率化を模索中にPythonと出合う。
業務とPythonの相性が良く、2倍以上の効率化を実現。現在も効率化を進行中。

※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。

スポンサードリンク

例外処理とは

例外処理は、簡単に説明すると「エラーを出さないようにする処理」のことです。

厳密に言うと、内部的にはエラーが発生しているのですが、それを表示させないようにする処理といった具合でしょうか。

例外処理について知りたい人
例外処理について知りたい人

え?エラーが発生しているのに表示させないと、
困ることもあるんじゃないの?

そうなんです。
しかし使う理由があります。具体例を交えながら、次項で説明いたしましょう。

例外処理を使う理由

1~5までの5つの処理をさせたくて、「1・2・3・4・5」とプログラムを書いたとします。
このとき、2つめでエラーが発生してしまうと、2以降のプログラムは処理されず、異常終了されてしまいます。
もう少しわかりやすくしてみましょう。

朝起きてからのルーティンを決めたとします。

  1. 顔を洗う
  2. トイレに行く
  3. 朝ごはんを食べる
  4. 歯を磨く
  5. 家を出る

2つ目の「トイレに行く」で誰かがトイレに入っていたら、トイレに行けずエラーになります。

プログラミングの世界では、ここで止まってしまって家を出ることができません。
「3.ごはんが炊けてなかったら」「4.歯ブラシが無かったら」という場合も同じです。

しかし例外処理は、何らかのエラーが発生しても処理を止めず、最後まで完了させることができるのです。
上の例では、「誰かがトイレに入っていたらトイレに行かない」、「ごはんが炊けてなかったらパンを食べる」など、スキップしたり、別の処理をさせたりできます。

if文のエラー版といったところでしょうか…。

<例外処理を使わなかった場合>

  1. 顔を洗う:正常終了
  2. トイレに行く:エラー発生 できない
  3. 朝ごはんを食べる:できない
  4. 歯を磨く:できない
  5. 家を出る:できない

<例外処理を使った場合>

  1. 顔を洗う:正常終了
  2. トイレに行く:エラー発生(スキップ)
  3. 朝ごはんを食べる:正常終了
  4. 歯を磨く:正常終了
  5. 家を出る:正常終了 いってきます!
スポンサードリンク

例外処理のメリット・デメリット

前項で少し触れたものもありますが、メリット・デメリットをまとめてみました。

<メリット>

  • エラー表示が出にくくなる
  • プログラムを最後まで処理できる可能性が高まる
  • プログラムの再実行が減る(時間がかかる場合は尚良し)

<デメリット>

  • エラーが出たのか正常終了したのかがわかりにくい
  • 処理がスキップされる場合があるため、予想外の結果になることがある
  • コードが増えるため、少し複雑になりやすい

一長一短といったところでしょうか…。
では、例外処理の書き方について解説していきましょう。

スポンサードリンク

例外処理の簡単な使い方・書き方

まずは簡単な例とテンプレを紹介します。

エラーが発生したら、画面に「できません」と表示させる例です。

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を開きました')    

上記コードの通常処理は以下の通りです。

  1. ワークブックを開く
  2. Sheet999を開く
  3. A1に1を記入する
  4. 保存する

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に関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

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