【ITニュース解説】Python Error Handling: try/except for Beginners
2026年09月24日に「Dev.to」が公開したITニュース「Python Error Handling: try/except for Beginners」について初心者にもわかりやすく解説しています。
ITニュース概要
Pythonのエラー処理`try/except`は、プログラムが予期せぬ入力などで突然停止するのを防ぐ。`try`ブロックで実行したい処理を囲み、エラーが起きた際に`except`ブロックの処理へ切り替え、プログラムを安全に継続させる。`finally`ブロックはエラーの有無に関わらず必ず実行されるため、後処理にも役立つ。適切なエラー処理で信頼性の高いプログラム作成が可能だ。
ITニュース解説
プログラム開発において、予期せぬエラーメッセージに遭遇し、プログラムが突然停止してしまうことに不安を感じるシステムエンジニアを目指す初心者は少なくない。しかし、エラーは単なる失敗ではなく、プログラムがどこで、なぜ正常に動作しないのかを具体的に教えてくれる貴重な情報源と捉えることができる。Pythonにおけるエラーハンドリングは、このようなエラーが発生した際に、プログラムが強制終了することなく、問題に対処しながら実行を継続するための重要な仕組みである。
具体的な例で考えてみよう。ユーザーに年齢の入力を求め、その値を表示する簡単なプログラムを作成したとする。
1age = int(input("Enter your age: ")) 2print(f"You are {age} years old")
このコードは、ユーザーが「25」のような数字を入力すれば問題なく動作する。しかし、もしユーザーが誤って「Twenty」のような文字列を入力した場合、int()関数は文字列を数値に変換できないため、ValueErrorというエラーが発生する。このエラーが発生すると、プログラムはその時点で実行を停止し、クラッシュしてしまう。たった一つの無効な入力が原因で、プログラム全体が利用できなくなるのは望ましくない状態だ。
この問題を解決し、プログラムの堅牢性を高めるための主要な方法が、try/except構文である。try/exceptを使用すると、エラーが発生する可能性のあるコードを「監視」し、実際にエラーが発生した場合には、あらかじめ定義しておいた代替処理を実行できる。
先ほどの年齢入力の例をtry/exceptで改善したコードは次のようになる。
1try: 2 age = int(input("Enter your age: ")) 3 print(f"You are {age} years old") 4except ValueError: 5 print("Please enter a number, not text.")
この修正されたコードでは、ユーザーが「Twenty」と入力した場合でも、プログラムはクラッシュしない。代わりに、「Please enter a number, not text.」というメッセージが表示され、プログラムの実行は中断せずに継続される。これは、ユーザーフレンドリーなアプリケーションを構築する上で非常に重要である。
try/except構文の仕組みを詳しく解説する。
まず、try:キーワードの後に続くブロックには、エラーが発生する可能性のあるコードを記述する。Pythonは、このtryブロック内のコードを通常通り実行しようと試みる。
もしtryブロック内でエラーが発生しなかった場合、Pythonはexceptブロックを完全にスキップし、try/except構文の次のコードへと処理を進める。
一方、もしtryブロック内で特定のタイプのエラー(この場合はValueError)が発生した場合、Pythonは直ちにtryブロックの残りの実行を中止し、該当するexcept ValueError:ブロックに記述されたコードを実行する。これにより、プログラムの予期せぬ停止を防ぎ、エラーに対する適切な対応が可能になるのだ。
プログラムでは、ValueError以外にも様々な種類のエラーが発生しうるため、複数のエラーに対応できるようにexceptブロックを複数記述することも可能である。例えば、数値を0で割ろうとすると発生するZeroDivisionErrorや、不適切な型の値を使用しようとすると発生するTypeErrorなど、異なるエラーに対してそれぞれ異なる処理を定義できる。
1try: 2 result = 10 / 0 3except ZeroDivisionError: 4 print("You can't divide by zero.") 5except TypeError: 6 print("Wrong type of value.")
このコードでは、10 / 0という処理がZeroDivisionErrorを引き起こすため、Pythonは最初のexcept ZeroDivisionError:ブロックを見つけてその中のメッセージを表示する。もしTypeErrorが発生した場合は、その次のexcept TypeError:ブロックが実行される。複数のexceptブロックがある場合、Pythonは発生したエラーに最初に見つかった一致するタイプに対応するブロックのみを実行し、その後、try/except構文の次のコードへと処理を進める。
try/except構文には、エラーの有無にかかわらず、常に実行されるコードを記述するためのfinallyブロックも用意されている。これは、ファイルのクローズやデータベース接続の解放など、プログラムがどのような状況でも必ず実行すべきクリーンアップ処理に非常に役立つ。
1try: 2 file = open("data.txt", "r") 3 content = file.read() 4except FileNotFoundError: 5 print("File not found.") 6finally: 7 print("Done trying to read the file.")
この例では、data.txtファイルが見つからずにFileNotFoundErrorが発生しても、「File not found.」と表示された後に「Done trying to read the file.」というメッセージが必ず表示される。ファイルが正常に開かれた場合でも、finallyブロック内のコードは実行される。これにより、リソースの適切な管理が保証されるため、プログラムの安定性を高めることができる。
try/exceptは非常に強力なツールだが、初心者が陥りやすい間違いもいくつか存在する。
一つ目は、すべてのエラーを捕捉しようとすることだ。特定の例外タイプを指定せずにexcept:とだけ記述すると、tryブロック内で発生するあらゆる種類のエラーを捕捉してしまう。これは一見便利に思えるが、予期せぬバグや深刻な問題までをも隠蔽してしまうため、プログラムのデバッグが極めて困難になる。常に具体的な例外タイプを指定し、本当に処理したいエラーのみを捕捉するように心がけるべきである。
二つ目は、空のexceptブロックを使用すること、特にpass文を使うことである。これは、エラーが発生しても何もせずに処理を先に進めることを意味する。結果として、ユーザーも開発者もエラーが発生したことに気づかず、後々より大きな問題に発展する可能性がある。最低限、エラーが発生したことをログに出力したり、ユーザーにエラーメッセージを表示したりするなど、何らかの形でエラーを通知する処理を含めるべきだ。エラーを「無視」するのではなく、「認識」し、「対処」することが重要である。
三つ目は、制御フローのためにtry/exceptを使用することである。try/exceptは、予期せぬエラーからの回復を目的としたものであり、プログラムの通常のロジック(例えば、条件分岐)を置き換えるために使うべきではない。エラーが発生する可能性のある特定のコードブロックにのみ適用し、それ以外の部分は通常の条件分岐やループで制御することが推奨される。
これらの知識を応用した実践的な例を見てみよう。ユーザーが正しい数値を入力するまで繰り返し入力を求める関数は、try/exceptを活用する良い例だ。
1def get_number(): 2 while True: 3 try: 4 return int(input("Enter a number: ")) 5 except ValueError: 6 print("That's not a number. Try again.") 7 8number = get_number() 9print(f"You entered: {number}")
このget_number関数は、while Trueループを使って無限にユーザーからの入力を受け付け、その入力をtryブロックでint型に変換しようと試みる。もしValueErrorが発生した場合、exceptブロックが実行され、「That's not a number. Try again.」というメッセージが表示されてループが続行される。ユーザーが有効な数値を入力するまで、このプロセスが繰り返されるため、プログラムは常に正しい数値入力を受け取ることができる。
まとめると、エラーハンドリングは、プログラムが予期せぬ問題に直面した際に、ただクラッシュするのではなく、適切に対応し、実行を継続するための不可欠な技術である。エラーメッセージはプログラムからの「何が問題か」というヒントであり、try/except構文を使いこなすことで、そのヒントを活かしてプログラムを回復させることができる。具体的には、特定の例外を捕捉し、finallyブロックで必ず実行すべきクリーンアップ処理を記述すること、そしてエラーをサイレントに無視せずに常に何らかの形で通知することが重要である。エラーハンドリングを適切に実装したプログラムは、より信頼性が高く、ユーザーにとって使いやすいものとなる。将来の自分や、そのプログラムを利用する人々のためにも、エラーハンドリングはコメントを追加するのと同じくらい自然な開発プロセスの一部として捉えるべきだ。