フリーキーズ | 独学プログラミング

Python例外処理入門!try/except/finallyの基本と使い分けを初心者向けに解説

リンドくん

リンドくん

たなべ先生、Pythonでプログラムを書いていると、時々エラーが出て止まっちゃうんです。どうすればいいんでしょうか?

たなべ

たなべ

いい質問だね!それこそ今日学ぶ例外処理の出番なんだ。
プログラムは必ずエラーが起きるものだから、上手にエラーを処理する方法を覚えることが大切なんだよ。

プログラミングを学んでいると、必ず遭遇するのが「エラー」です。
ファイルが見つからない、数値ではない文字を計算しようとした、ネットワークに接続できない...など、様々な理由でプログラムは予期しない状況に直面します。

こうした問題を解決するのが例外処理という仕組みです。
Pythonではtryexceptfinallyというキーワードを使って、エラーが発生した時の対処法を事前に準備しておくことができます。

この記事では、Python初心者の方でもわかりやすいように、例外処理の基本概念から実践的な使い方まで、段階的に解説していきます。

プログラミング学習でお悩みの方へ

HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。

✓ 質問し放題

✓ β版公開中(2025年内の特別割引)

HackATAの詳細を見る

そもそも例外処理とは何か?

リンドくん

リンドくん

例外処理って、具体的には何をするものなんですか?

たなべ

たなべ

簡単に言うと、「もしエラーが起きたらこうしてね」という指示をプログラムに与えることなんだ。
例えば、ファイルが見つからなかった時に「エラーメッセージを表示する」とか「別の処理をする」とか決めておくんだよ。

例外処理の基本概念

例外処理とは、プログラム実行中に発生する予期しないエラーに対して、適切な対処法を事前に定義しておく仕組みです。
これにより、エラーが発生してもプログラムが突然停止することなく、適切な処理を継続できるようになります。

例外処理がない場合、以下のような問題が発生します。

  • プログラムの突然の停止 → ユーザーにとって不親切
  • エラーの原因が分からない → デバッグが困難
  • データの不整合 → 処理が中途半端で終わる

なぜ例外処理が重要なのか

実際のプログラム開発では、以下のような予期しない状況が頻繁に発生します。

# エラーが発生する例
number = int(input("数字を入力してください: "))  # 文字が入力される可能性
result = 10 / number  # ゼロ除算エラーの可能性

このコードは、ユーザーが「0」や「abc」などを入力すると、エラーで停止してしまいます。しかし、例外処理を使うことで、こうした問題を事前に対処できるのです。

例外処理の基本的な考え方

例外処理の基本的な流れは以下のようになります。

  1. 危険な処理を実行してみる(try)
  2. エラーが発生した場合の対処を定義(except)
  3. エラーの有無に関わらず実行する処理(finally)

この仕組みにより、プログラムはより安全で予測可能な動作をするようになります。

try文の基本的な使い方

リンドくん

リンドくん

tryって、どうやって使うんですか?

たなべ

たなべ

tryは「この処理を試してみて」という意味なんだ。
もしエラーが起きたら、自動的にexceptの方に処理が移るんだよ。

try文の基本構文

Pythonの例外処理の最も基本的な形は以下のようになります。

try:
    # エラーが発生する可能性のある処理
    危険な処理
except:
    # エラーが発生した時の処理
    エラー時の対処

実践的な例

数値の入力を受け取る簡単な例を見てみましょう。

try:
    number = int(input("数字を入力してください: "))
    result = 10 / number
    print(f"結果: {result}")
except:
    print("エラーが発生しました。正しい数字を入力してください。")

この例では、以下のような流れで処理が行われます。

  1. try部分を実行 → ユーザーの入力を数値に変換し、計算を実行
  2. エラーが発生しなかった場合 → 結果を表示してプログラム終了
  3. エラーが発生した場合 → except部分が実行され、エラーメッセージを表示

より具体的な使用例

ファイルの読み込みでの例外処理は以下です。

try:
    with open("data.txt", "r") as file:
        content = file.read()
        print(content)
except:
    print("ファイルが見つからないか、読み込めませんでした。")

この方法により、ファイルが存在しない場合でもプログラムがクラッシュすることなく、適切なメッセージを表示できます。

except文による具体的なエラー処理

リンドくん

リンドくん

except文では、エラーの種類によって違う処理ができるんですか?

たなべ

たなべ

その通り!エラーの種類ごとに異なる対処法を設定できるんだ。
これによって、より親切で分かりやすいエラーメッセージを表示できるよ。

特定の例外を捕捉する

Pythonでは、発生するエラーの種類に応じて異なる処理を行うことができます。

try:
    number = int(input("数字を入力してください: "))
    result = 10 / number
    print(f"結果: {result}")
except ValueError:
    print("数字ではない文字が入力されました。")
except ZeroDivisionError:
    print("0で割ることはできません。")

主要な例外の種類

Pythonでよく発生する例外の種類は以下の通りです。

  • ValueError → 適切でない値が渡された時
  • ZeroDivisionError → ゼロ除算が発生した時
  • FileNotFoundError → ファイルが見つからない時
  • KeyError → 辞書に存在しないキーでアクセスした時
  • IndexError → リストの範囲外にアクセスした時

複数の例外を同時に処理

複数の例外を同時に処理したい場合は、タプルを使用します。

try:
    # 何らかの処理
    pass
except (ValueError, TypeError):
    print("値の型に関するエラーが発生しました。")
except (FileNotFoundError, PermissionError):
    print("ファイルアクセスに関するエラーが発生しました。")

エラー情報を取得する

例外が発生した際に、詳細な情報を取得することも可能です。

try:
    number = int(input("数字を入力してください: "))
    result = 10 / number
except ValueError as e:
    print(f"値エラー: {e}")
except ZeroDivisionError as e:
    print(f"ゼロ除算エラー: {e}")

この方法により、エラーの詳細な内容をユーザーや開発者に伝えることができます。

finally文の役割と活用場面

リンドくん

リンドくん

finallyって何のために使うんですか?

たなべ

たなべ

finally「エラーが起きても起きなくても、必ず実行したい処理」を書く場所なんだ。
ファイルを閉じたり、データベース接続を切断したりする時によく使うよ。

finally文の基本概念

finally文は、try文内でエラーが発生してもしなくても、必ず実行される処理を記述するために使用します。
これは特にリソースのクリーンアップ(ファイルを閉じる、ネットワーク接続を切断するなど)において重要な役割を果たします。

finally文の基本構文

try:
    # 何らかの処理
    pass
except Exception as e:
    # エラー処理
    print(f"エラー: {e}")
finally:
    # 必ず実行される処理
    print("処理が完了しました。")

ファイル操作での使用例

file = None
try:
    file = open("important_data.txt", "w")
    file.write("重要なデータ")
    # 何らかのエラーが発生する可能性のある処理
    risky_operation()
except Exception as e:
    print(f"エラーが発生しました: {e}")
finally:
    if file:
        file.close()
        print("ファイルを安全に閉じました。")

データベース接続の例

import sqlite3

connection = None
try:
    connection = sqlite3.connect("database.db")
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM users")
    results = cursor.fetchall()
    print(results)
except Exception as e:
    print(f"データベースエラー: {e}")
finally:
    if connection:
        connection.close()
        print("データベース接続を閉じました。")

finallyが特に重要な場面

finally文が特に重要になるのは以下のような場面です。

  • ファイル操作 → ファイルが確実に閉じられることを保証
  • ネットワーク接続 → 接続が適切に切断されることを保証
  • ログ出力 → 処理の完了を記録
  • リソースの解放 → メモリや他のシステムリソースの適切な解放

else文と組み合わせた例外処理

else文の使い方

あまり知られていませんが、try文にはelse文も使用できます。
else文はエラーが発生しなかった場合のみ実行される処理を記述します。

try:
    number = int(input("数字を入力してください: "))
    result = 10 / number
except ValueError:
    print("数字ではない文字が入力されました。")
except ZeroDivisionError:
    print("0で割ることはできません。")
else:
    print(f"計算結果: {result}")
    print("正常に処理が完了しました。")
finally:
    print("プログラムを終了します。")

完全な例外処理の構文

try:
    # エラーが発生する可能性のある処理
    pass
except SpecificError:
    # 特定のエラーの処理
    pass
except Exception as e:
    # その他のエラーの処理
    pass
else:
    # エラーが発生しなかった場合の処理
    pass
finally:
    # 必ず実行される処理
    pass

例外処理のベストプラクティス

リンドくん

リンドくん

例外処理を使う時に気をつけるべきことはありますか?

たなべ

たなべ

いい質問だね!例外処理にも正しい使い方があるんだ。
適切に使わないと、かえってバグを見つけにくくなったりするから注意が必要なんだよ。

適切な例外処理の原則

1. 具体的な例外を捕捉する

# 悪い例
try:
    process_data()
except:  # すべての例外を捕捉してしまう
    pass

# 良い例
try:
    process_data()
except FileNotFoundError:
    print("設定ファイルが見つかりません。")
except ValueError as e:
    print(f"データの形式が正しくありません: {e}")

2. エラーメッセージを分かりやすくする

try:
    age = int(input("年齢を入力してください: "))
    if age < 0:
        raise ValueError("年齢は正の数である必要があります。")
except ValueError as e:
    print(f"入力エラー: {e}")
    print("正しい数字を入力してください。")

3. ログを適切に記録する

import logging

try:
    critical_operation()
except Exception as e:
    logging.error(f"重要な処理でエラーが発生しました: {e}")
    # ユーザー向けのメッセージ
    print("申し訳ございません。システムエラーが発生しました。")

カスタム例外の作成

独自の例外クラスを作成することで、より意味のあるエラー処理が可能になります。

class InvalidAgeError(Exception):
    """年齢が無効な場合の例外"""
    pass

def validate_age(age):
    if age < 0:
        raise InvalidAgeError("年齢は0以上である必要があります。")
    if age > 150:
        raise InvalidAgeError("年齢は150以下である必要があります。")
    return True

try:
    user_age = int(input("年齢を入力してください: "))
    validate_age(user_age)
    print(f"年齢: {user_age}歳で登録しました。")
except ValueError:
    print("数字を入力してください。")
except InvalidAgeError as e:
    print(f"年齢エラー: {e}")

まとめ

リンドくん

リンドくん

例外処理って、最初は難しそうでしたけど、意外と理解できました!

たなべ

たなべ

その調子だね!例外処理はプログラムを安全にする重要な技術なんだ。
最初は基本的な使い方から始めて、徐々に複雑な処理にも挑戦してみてね。

Pythonの例外処理は、エラーが発生しても適切に対処できる堅牢なプログラムを作るための重要な仕組みです。
tryexceptfinallyの基本的な使い方から、具体的なエラー種別の処理、ベストプラクティスまで学習してきました。

重要なポイントのおさらい

  • try文でエラーが発生する可能性のある処理を囲む
  • except文で具体的なエラーの種類に応じた適切な処理を定義
  • finally文でエラーの有無に関わらず必ず実行したい処理を記述
  • 具体的な例外型を指定することで、より適切なエラー処理が可能

例外処理を適切に使うことで、ユーザーにとって親切なプログラムを作ることができます。
エラーが発生した時に突然停止するのではなく、分かりやすいメッセージを表示したり、代替処理を実行したりできるようになります。

この記事をシェア

関連するコンテンツ