Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Python辞典

  1. トップページ
  2. Python辞典
  3. try / except / else / finally

try / except / else / finally

Pythonの例外処理はtry/except構文で行います。エラーが発生しても処理を継続したい場合や、エラーに応じた処理を分岐したい場合に使います。例外を握りつぶす(何もしないexceptブロック)はバグの発見を困難にするため避けるべきです。elseは例外が発生しなかった場合に、finallyは例外の有無に関わらず必ず実行されます。

構文
try:
    # 例外が発生する可能性のある処理
except 例外クラス as e:
    # 例外発生時の処理
except (例外クラス1, 例外クラス2) as e:
    # 複数の例外をまとめて処理
else:
    # 例外が発生しなかった場合の処理
finally:
    # 例外の有無に関わらず必ず実行される処理

# 例外を発生させる
raise 例外クラス("メッセージ")
キーワード一覧
キーワード概要
try例外が発生する可能性のある処理を囲むブロック。
except 例外クラス指定した例外クラスが発生したときに実行するブロック。
except Exception as e例外オブジェクトを変数eで受け取る。
elsetryブロックで例外が発生しなかった場合に実行するブロック。
finally例外の有無に関わらず必ず実行するブロック(リソース解放に使う)。
raise意図的に例外を発生させる。
Exception標準的な例外の基底クラス。
サンプルコード
# 基本的なtry/except
try:
    result = 10 / 0
except ZeroDivisionError as e:
    print(f"エラー: {e}")   # エラー: division by zero

# 複数の例外を処理
def convert_to_int(value):
    try:
        return int(value)
    except ValueError:
        print(f"'{value}' は整数に変換できません")
        return None
    except TypeError:
        print(f"型が不正です: {type(value).__name__}")
        return None

print(convert_to_int('42'))     # 42
print(convert_to_int('abc'))    # エラーメッセージ + None
print(convert_to_int(None))     # エラーメッセージ + None

# else: 例外が発生しなかった場合
try:
    num = int(input("数値を入力: "))
except ValueError:
    print("数値ではありません")
else:
    print(f"入力された数値: {num}")    # 例外なしの場合だけ実行

# finally: 必ず実行される(リソースの解放など)
file = None
try:
    file = open('data.txt', 'r')
    content = file.read()
except FileNotFoundError:
    print("ファイルが見つかりません")
finally:
    if file:
        file.close()    # 例外の有無に関わらずファイルを閉じる

# raise: 例外を意図的に発生させる
def divide(a, b):
    if b == 0:
        raise ValueError("0で割ることはできません")
    return a / b

try:
    print(divide(10, 0))
except ValueError as e:
    print(f"エラー: {e}")   # エラー: 0で割ることはできません

# 例外の再送出
try:
    result = divide(10, 0)
except ValueError:
    print("処理を記録しました")
    raise   # 同じ例外を再送出
概要

exceptブロックは上から順に評価されるため、より具体的な例外クラスを先に書く必要があります。例えばExceptionはほぼすべての例外の基底クラスなので、先に書くと後続のexceptブロックが実行されません。

『else』ブロックは「tryが成功した場合に実行したいが、tryブロック自体には含めたくない処理」を記述するのに使います。これにより、エラーハンドリング対象の処理と成功後の処理を明確に分離できます。

ファイルやネットワーク接続などのリソース管理には、finallyを使うよりも『with』文(コンテキストマネージャ)を使う方がPythonicです。withを使えばブロックの終了時に自動でリソースが解放されます。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。