【Python基礎9】例外処理の基礎|エラーを防ぎ、プログラムを安定化させる方法

例外処理とは?プログラムのエラーを安全に処理するために

例外とエラーの違い

プログラムを実行するとき、予期しない事態によってプログラムが停止することがあります。これを「エラー」と呼びます。Pythonにはエラーを捕捉して適切に処理する仕組みがあり、これを「例外処理」といいます。

例外処理の目的

  • プログラムの途中でエラーが発生しても、クラッシュしないようにする
  • エラーメッセージを表示し、原因を特定しやすくする
  • 必要に応じて代替処理を行い、プログラムを正常に動作させる

try-except構文の基本

try-exceptの基本構文

Pythonで例外を処理するためには、tryブロックに通常のコードを記述し、exceptブロックにエラーが発生したときの処理を記述します。

構文:

try:
    # エラーが発生する可能性のある処理
except エラーの種類:
    # エラーが発生したときの処理

基本的な例

次の例では、0で割る操作を行い、エラーをキャッチしてメッセージを表示します:

try:
    result = 10 / 0
except ZeroDivisionError:
    print("0で割ることはできません。")

出力:

0で割ることはできません。

複数の例外を処理する方法

複数のexceptブロックを使う

1つのtryブロックに対して複数のexceptブロックを使い、異なるエラーに対して異なる処理を行うことができます。

例:

try:
    value = int("abc")
    result = 10 / 0
except ValueError:
    print("無効な整数です。")
except ZeroDivisionError:
    print("0で割ることはできません。")

出力:

無効な整数です。

すべての例外をまとめて処理する方法

どんなエラーでも共通の処理を行いたい場合は、exceptの後に具体的なエラーの種類を指定せずに使うことができます。

例:

try:
    value = int("abc")
except Exception as e:
    print(f"エラーが発生しました: {e}")

出力:

エラーが発生しました: invalid literal for int() with base 10: 'abc'

elseブロックとfinallyブロックの使い方

elseブロックの概要

tryブロック内の処理が正常に完了した場合にだけ実行される処理をelseブロックに記述します。

例:

try:
    result = 10 / 2
except ZeroDivisionError:
    print("0で割ることはできません。")
else:
    print(f"計算結果: {result}")

出力:

計算結果: 5.0

finallyブロックの概要

finallyブロックは、エラーの有無にかかわらず必ず実行されるコードを記述します。ファイルのクローズ処理や、リソースの開放などに使われます。

例:

try:
    file = open("sample.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("ファイルが見つかりません。")
finally:
    print("処理が終了しました。")

出力:

ファイルが見つかりません。  
処理が終了しました。

例外を自分で発生させる(raise文)

raise文の基本

特定の条件下で自分で例外を発生させるには、raise文を使います。これにより、ユーザー定義のエラー処理が可能です。

例: 年齢が負の値の場合に例外を発生させる

def check_age(age):
    if age < 0:
        raise ValueError("年齢は負の値にはできません。")
    print(f"あなたの年齢は {age} 歳です。")

try:
    check_age(-5)
except ValueError as e:
    print(f"エラー: {e}")

出力:

エラー: 年齢は負の値にはできません。

ユーザー定義の例外

独自の例外クラスを作成する

Pythonでは、独自の例外を作成することができます。Exceptionクラスを継承して新しい例外クラスを作成し、特定の状況でエラーを発生させます。

例:

class CustomError(Exception):
    pass

def check_value(value):
    if value > 100:
        raise CustomError("値が100を超えています。")

try:
    check_value(150)
except CustomError as e:
    print(f"カスタムエラーが発生しました: {e}")

出力:

カスタムエラーが発生しました: 値が100を超えています。

例外処理を活用した応用例

ファイル操作と例外処理

次のプログラムでは、ファイルを開く処理中にエラーが発生しても、必ずリソースが解放されるように例外処理を行っています。

例:

try:
    with open("non_existent_file.txt", "r") as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print("指定されたファイルが見つかりません。")
except PermissionError:
    print("ファイルのアクセス権がありません。")
finally:
    print("ファイル処理を終了しました。")

出力:

指定されたファイルが見つかりません。  
ファイル処理を終了しました。

まとめと次のステップ

例外処理は、プログラムの安定性を高め、ユーザーに適切なエラーメッセージを表示するための重要な技術です。try-except構文、raise文、カスタム例外の作成などの基本を理解することで、予期しないエラーに対して柔軟に対応できるプログラムが書けるようになります。次のステップとして、例外処理を使った実際のプロジェクトに挑戦し、エラーが発生してもプログラムが正常に動作する仕組みを構築してみましょう!