PythonでファイルやディレクトリのI/Oエラーを安全に処理するテクニック

この記事では、PythonでファイルやディレクトリのI/O(入出力)エラーを安全に処理するためのテクニックを紹介します。具体的なコード例とその解説、さらには応用例まで含めています。

目次

はじめに

I/Oエラーは、プログラムがファイルやディレクトリにアクセスする際に頻繁に発生する可能性があります。例えば、ファイルが存在しない、ディスクがいっぱいで書き込みできない、パーミッションがないなどの場合です。これらのエラーを適切に処理することで、より堅牢なプログラムを作成できます。

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

try-exceptブロック

最も基本的なエラーハンドリングの方法は、`try-except`ブロックを使用することです。

# ファイル読み込みの例
try:
    with open('example.txt', 'r') as file:
        content = file.read()
except FileNotFoundError:
    print('ファイルが見つかりませんでした。')
except PermissionError:
    print('ファイルの読み込み権限がありません。')

エラーの種類を特定する

`except`節には、処理したいエラーの種類(例外クラス)を指定できます。上記の例では`FileNotFoundError`と`PermissionError`を指定しています。

高度なエラーハンドリング

errnoモジュールを使う

`errno`モジュールを使用することで、エラーコードに基づいて条件分岐を行うことができます。

import errno
try:
    with open('example.txt', 'r') as file:
        content = file.read()
except IOError as e:
    if e.errno == errno.ENOENT:
        print('ファイルが見つかりませんでした。')
    elif e.errno == errno.EACCES:
        print('ファイルの読み込み権限がありません。')

応用例

1. ログファイルにエラー情報を保存

try:
    with open('example.txt', 'r') as file:
        content = file.read()
except Exception as e:
    with open('error.log', 'a') as log_file:
        log_file.write(str(e) + '\n')

2. エラー発生時にリトライ

import time

for i in range(3):  # 最大で3回リトライ
    try:
        with open('example.txt', 'r') as file:
            content = file.read()
        break  # 成功したらループを抜ける
    except FileNotFoundError:
        print(f'ファイルが見つかりません。{i + 1}回目のリトライです。')
        time.sleep(1)  # 1秒待つ

3. ファイルが存在しない場合のデフォルト値設定

try:
    with open('example.txt', 'r') as file:
        content = file.read()
except FileNotFoundError:
    content = 'デフォルト値'

まとめ

この記事では、PythonでのファイルやディレクトリのI/Oエラーを安全に処理するための基本的なテクニックから高度な方法、さらには応用例までを解説しました。これらのテクニックを利用することで、堅牢なプログラムを開発する一歩を踏み出しましょう。

コメント

コメントする

目次