こんにちは、PyQサポートです。
エラーには、プログラムの構文エラーの他に、「読む込むはずのファイルが存在しない」「データベースが開けない」など外部の要因で起こるエラーがあります。
その外部のエラーが起きたときに障害時対応をする仕組みとして、Pythonには、try/except
(例外処理)があります。今回は、この例外処理の書き方についてのQ&Aを紹介します。
質問:try節のある処理で例外が起きたとき、except節でその処理をもう一度実行してもよいでしょうか?
ある処理Xで例外が発生してもプログラムを止めることなく処理Xを強行させたいと考え、以下のように実装しました。
このような書き方をしてもよいでしょうか?
Try: 行いたい処理X except: 行いたい処理X
回答:処理を繰り返すのは、一般的には同じ例外が発生するため、無駄になる可能性が高いです
例外が起きた場合に except
のブロックにも同じ処理をもう一度書く方法ですね。この書き方は、基本的におすすめしません。
この書き方をすると except
の中の「行いたい処理X」で例外が再度発生し、例外処理を行っていないのと同じになる可能性が高いです。
一般的な例外処理の対処法では、まずは「行いたい処理X」の中のどこでどのような例外が発生する可能性があるかをリストアップする必要があります。
そして 発生した例外ごとに対処を明確にすべき です。
また、可能であれば try/except
の範囲を「行いたい処理X」全体ではなく、その中の例外が発生しうる箇所のみに絞りこむべきです。
他にも、以下のように例外が起きても無視する書き方もおすすめしません。
pass
は処理が except
ブロックに移っても何もせずにブロックを抜ける書き方です。
except
ブロック内で例外に対して何も対応していないことになります。
Try: 行いたい処理X except: pass
自走プログラマーのエラーハンドリングが参考になると思います。
自走プログラマー
自走プログラマーは、PyQを運営している株式会社ビープラウド監修の書籍です。
開発現場で起こった実際の問題とその解決法をもとに、文法以外に必要な「プロジェクトの各段階でプログラマーがやること」「その選択をどう判断するのか」「どうコードを実装して実現していくのか」を解説します。
以下にある抜粋版の記事を参照ください。 3.1. エラーハンドリング — 自走プログラマー【抜粋版】