プログラムを書いていると、「実行した瞬間にエラーが出て止まってしまった」という経験は誰にでもあります。特にユーザーの入力やファイルの読み込みを扱うプログラムでは、想定外の値が来るだけで処理が止まってしまいます。そんなときに役立つのが 例外処理(try-except) です。
この記事では、Pythonの例外処理について、基本の try-except 構文から、else・finally、複数例外の処理、raise による例外の発生まで、初心者の方にも分かりやすく解説します。実際に動くコードと実行結果を見ながら、エラーに強いプログラムの書き方を身につけていきましょう。
コンテンツ
例外処理とは?エラーでプログラムが止まる問題
Pythonでは、プログラムの実行中に問題が起きると「例外(Exception)」が発生します。例外が発生したまま何もしないでいると、プログラムはその場で強制終了してしまいます。
例えば、次のように文字列を数値に変換しようとすると ValueError という例外が発生します。
# 数字ではない文字列を数値に変換しようとすると…
number = int("abc")
# ここでValueErrorが発生し、プログラムが止まってしまうこのとき実際には ValueError: invalid literal for int() with base 10 のようなメッセージが表示されます。
このように、途中でプログラムが止まってしまうと、その後の処理がすべて実行されなくなります。例外処理を使うと、エラーが起きてもプログラムを止めずに、代わりの処理を実行することができます。
try-exceptの基本構文
例外処理の基本は try と except です。try ブロックに「エラーが起きるかもしれない処理」を書き、except ブロックに「エラーが起きたときの処理」を書きます。
try:
number = int(input("数字を入力してください: "))
print(number * 2)
except ValueError:
print("数字ではない値が入力されました")この例では、ユーザーが「5」と入力すれば 10 が表示されますが、「abc」のように数字でない値を入力しても、プログラムは止まらずに「数字ではない値が入力されました」と表示されます。エラーで落ちる代わりに、丁寧なメッセージを返せるわけです。
例外の種類を指定してキャッチする
例外にはたくさんの種類があります。よく出会うものをいくつか挙げてみましょう。
ValueError:値が不適切なとき(例:int(“abc”))ZeroDivisionError:0で割り算をしたときTypeError:型が合わない演算をしたときFileNotFoundError:指定したファイルが存在しないときKeyError:辞書に存在しないキーを指定したとき
例えば、0での割り算は ZeroDivisionError になります。
try:
result = 10 / 0
except ZeroDivisionError:
print("0で割ることはできません")
# 出力: 0で割ることはできませんなお、int() などの型変換でエラーが起きやすいポイントについては、Pythonの型変換(キャスト)の使い方を解説した記事もあわせて読むと理解が深まります。どんなときに ValueError が出るのかがイメージしやすくなりますよ。
例外処理を意識してコードを書けるようになると、一気に「実務で通用するコード」に近づきます。とはいえ、独学だと「なぜエラーになるのか」「どう直せばいいのか」で手が止まってしまいがちですよね。もし独学で伸び悩みを感じているなら、現役エンジニアに質問できる環境を用意するのも一つの手です。マンツーマンで学べるスクールについては、TechAcademyの評判を辛口レビューも含めて徹底解説した記事で詳しくまとめているので、独学の次の一歩として参考にしてみてください。
elseとfinallyの使い方
try-except には、else と finally を追加できます。else は「例外が起きなかったとき」に実行され、finally は「例外の有無にかかわらず必ず」実行されます。
try:
f = open("data.txt", "r", encoding="utf-8")
except FileNotFoundError:
print("ファイルが見つかりません")
else:
print("ファイルを正常に開けました")
f.close()
finally:
print("処理を終了します")finally は、ファイルを閉じたり後片づけをしたりする処理を書くのに便利です。ただし、ファイル操作については with 構文を使うと自動でクローズしてくれるので、より安全でスマートに書けます。詳しくは with構文の使い方を解説した記事を参考にしてください。
複数の例外をまとめて処理する
複数の種類の例外を同じように処理したい場合は、except にタプルで例外を並べて指定できます。また as を使うと、エラーメッセージの内容を受け取れます。
try:
value = int("abc")
except (ValueError, TypeError) as e:
print(f"エラーが発生しました: {e}")
# 出力: エラーが発生しました: invalid literal for int() with base 10: 'abc'as e で受け取った例外オブジェクトを print すると、具体的なエラー内容が確認できます。デバッグのときにとても役立ちます。
raiseで自分から例外を発生させる
自分で意図的に例外を発生させたいときは raise を使います。関数に不正な値が渡されたときに、あえてエラーを出して呼び出し側に知らせる、といった使い方をします。
def set_age(age):
if age < 0:
raise ValueError("年齢に負の数は指定できません")
return age
try:
set_age(-5)
except ValueError as e:
print(e)
# 出力: 年齢に負の数は指定できませんこのように raise を使うと、「想定外の値はここではじく」という防御的なプログラムが書けるようになります。
例外処理を使うときの注意点
tryブロックはできるだけ小さく保ち、エラーが起きうる処理だけを囲むようにしましょう。- 例外の種類を指定せず
except:だけで書くと、想定外のエラーまで握りつぶしてしまい、バグの発見が遅れます。 - エラーを
exceptで受け取ったのに何もしない(passだけ)のは避けましょう。最低限ログやメッセージを残すのがおすすめです。 - 例外処理は「起こりうるエラーへの備え」です。本来直すべきバグを隠すために使わないよう注意しましょう。
もっと効率的にPythonを学びたい人へ
※本記事には広告(アフィリエイトリンク)を含みます。
例外処理のように「実務で本当に必要な書き方」は、独学だけだと後回しになりがちです。未経験からPythonを最短で身につけたい、エラーで詰まったときにすぐ質問できる環境がほしいという方は、マンツーマン指導のスクールを検討してみるのも良い選択です。無料カウンセリングで学習プランや転職サポートの相談だけしてみる、という使い方もできます。
Pythonプログラミング|マンツーマンレッスンで初めてをプロに育てる【Python Winner】![]()
まとめ
今回はPythonの例外処理(try-except)について解説しました。ポイントを振り返っておきましょう。
try-exceptを使うと、エラーが起きてもプログラムを止めずに処理を続けられるexceptにはValueErrorやZeroDivisionErrorなど、キャッチしたい例外の種類を指定するelseは例外が起きなかったとき、finallyは必ず実行される- 複数の例外はタプルでまとめて指定でき、
asでエラー内容を受け取れる raiseを使えば、自分から意図的に例外を発生させられるtryブロックは小さく、例外は種類を指定して受け取るのが安全
例外処理を使いこなせるようになると、ユーザーの入力ミスや予期しないデータにも動じない、丈夫なプログラムが書けるようになります。ぜひ実際に手を動かして試してみてください。
ナノトイラボ 