ゼロからプログラマーになるために!【入出力とファイル操作編:5-4】エラーハンドリング(例外処理)

program

プログラムを実行する際、予期しないエラーが発生することがあります。エラーハンドリング(例外処理)を適切に実装することで、プログラムを安定させ、ユーザーにわかりやすいエラー情報を提供できます。この章では、Pythonでのエラーハンドリングの基本や実践的な使い方について解説します。


エラーハンドリングとは?

エラーハンドリングとは、プログラムの実行中に発生するエラー(例外)を適切に処理する仕組みです。エラーが発生すると、通常はプログラムが停止しますが、エラーハンドリングを行うことで、エラー発生時の動作を制御できます。


エラー(例外)とは?

エラー(例外)とは、プログラムが正常に実行できなくなったときに発生するイベントです。Pythonでは、エラー(例外)は Exception クラスを基底として定義されています。


基本的なエラーハンドリング構文

Pythonでは、tryexceptelsefinally を使って例外処理を記述します。

基本構文

try:
# エラーが発生する可能性のあるコード
except エラータイプ:
# エラーが発生した場合の処理
else:
# エラーが発生しなかった場合の処理(任意)
finally:
# 最後に必ず実行する処理(任意)

例:ゼロ除算のエラーハンドリング

try:
num = int(input("割られる数を入力してください: "))
divisor = int(input("割る数を入力してください: "))
result = num / divisor
print(f"結果: {result}")
except ZeroDivisionError:
print("エラー: 0で割ることはできません。")
except ValueError:
print("エラー: 数値を入力してください。")
else:
print("計算が成功しました。")
finally:
print("プログラムを終了します。")

実行結果

正常入力

割られる数を入力してください: 10
割る数を入力してください: 2
結果: 5.0
計算が成功しました。
プログラムを終了します。

エラー入力(0で割る)

割られる数を入力してください: 10
割る数を入力してください: 0
エラー: 0で割ることはできません。
プログラムを終了します。

エラー入力(文字列)

割られる数を入力してください: 10
割る数を入力してください: abc
エラー: 数値を入力してください。
プログラムを終了します。

よく使う例外の種類

Pythonには、特定の状況で発生するさまざまな例外が用意されています。

例外名説明発生例
ZeroDivisionError0で割ろうとしたときに発生10 / 0
ValueError型が正しくない値を渡されたときに発生int("abc")
FileNotFoundError存在しないファイルを開こうとしたときに発生open("not_exist.txt", "r")
TypeErrorデータ型が適切でない操作を行ったときに発生"abc" + 123
KeyError辞書に存在しないキーを参照したときに発生my_dict["nonexistent_key"]

実践例

例1:ファイル読み込みのエラーハンドリング

try:
with open("data.txt", "r") as file:
content = file.read()
print(content)
except FileNotFoundError:
print("エラー: ファイルが見つかりません。")

例2:複数の例外を処理

try:
number = int(input("整数を入力してください: "))
result = 100 / number
print(f"結果: {result}")
except ValueError:
print("エラー: 数値を入力してください。")
except ZeroDivisionError:
print("エラー: 0で割ることはできません。")

例3:カスタム例外

独自の例外を作成することで、特定の状況に対応したエラーメッセージを出力できます。

class NegativeValueError(Exception):
pass

def check_positive(number):
if number < 0:
raise NegativeValueError("負の値は許可されていません。")

try:
num = int(input("正の整数を入力してください: "))
check_positive(num)
print(f"入力値: {num}")
except NegativeValueError as e:
print(f"エラー: {e}")

上記のコード解説はこちら


エラーハンドリングのベストプラクティス

  1. 具体的な例外を処理
    明確な例外を指定することで、予期しないエラーに対応できます。
  2. finally を活用
    ファイルやネットワーク接続など、リソースの解放が必要な場合に使用します。
  3. エラーメッセージを分かりやすく
    ユーザーに理解しやすいエラー情報を提供しましょう。
  4. ログを記録
    エラー内容をファイルに記録して、デバッグやトラブルシューティングに活用します。

例:エラーログの記録

import logging

logging.basicConfig(filename="error.log", level=logging.ERROR)

try:
with open("nonexistent.txt", "r") as file:
content = file.read()
except FileNotFoundError as e:
logging.error(f"エラー: {e}")
print("エラーが発生しました。ログを確認してください。")

error.log の内容

ERROR:root:エラー: [Errno 2] No such file or directory: 'nonexistent.txt'

図解:エラーハンドリングの流れ

1. tryブロック内で処理を実行

2. 例外が発生した場合はexceptブロックへ

3. 例外が発生しない場合はelseブロックへ(任意)

4. finallyブロックで後処理を実行(任意)

まとめ

  • エラーハンドリング を使うと、プログラムの安定性が向上し、ユーザーにわかりやすいエラー情報を提供できます。
  • try-except を使い、特定の例外に応じた処理を行いましょう。
  • ログの記録カスタム例外 を活用することで、トラブルシューティングが容易になります。

次のステップ:オブジェクト指向プログラミング(OOP)の基本

次回は、オブジェクト指向プログラミング(OOP)の基本を学びます。クラスやオブジェクトを使ったプログラム設計の基礎を習得し、より高度なプログラム構築を目指しましょう!

コメント

タイトルとURLをコピーしました
//投稿内コードにコピー表示 //コピー表示ここまで