0Pricing
Python Academy · レッスン

例外の発生と再発生

raise でエラーを通知し、再発生させて上位へ伝播します。

「例外の発生と再発生」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。

はじめに

raise キーワードを使うと、エラーを明示的に通知できます。再送出すると、元のエラーのコンテキストが保持されます。

組み込み例外の raise

raise ValueError('message') は、指定したメッセージとともに、その例外型をすぐに発生させます。
def divide(a, b):
    if b == 0:
        raise ValueError('Denominator cannot be zero')
    return a / b
try:
    divide(5, 0)
except ValueError as e:
    print(e)

同じ例外の再送出

except 内で引数なしの raise を使うと、現在の例外を再送出し、元のトレースバックを保持します。
def process(data):
    try:
        return int(data)
    except ValueError:
        print('logging error')
        raise  # re-raises original
try:
    process('abc')
except ValueError:
    print('caller caught it')

from による例外の連鎖

raise NewError('msg') from original は例外を連鎖させます。exc.__cause__ が設定されます。
try:
    int('abc')
except ValueError as original:
    raise RuntimeError('processing failed') from original

例外の連鎖を抑制する

raise NewError() from None は連鎖を切断し、トレースバックで元の例外を抑制します。
try:
    int('abc')
except ValueError:
    raise RuntimeError('clean error') from None

assert 文

assert condition, 'message' は、condition が False の場合に AssertionError を発生させます。開発中の不変条件にのみ使用してください。
def sqrt(x):
    assert x >= 0, f'Input must be non-negative, got {x}'
    return x ** 0.5
try:
    sqrt(-1)
except AssertionError as e:
    print(e)

条件付きの raise

関数の先頭で raise を使うガード節により、事前条件を明示し、深いネストを避けられます。
def process(items):
    if not items:
        raise ValueError('items must not be empty')
    return items[0]
print(process([1, 2, 3]))

再送出と新しい例外の違い

再送出(裸の raise)はコンテキストを保持します。新しい例外を発生させるとコンテキストが隠れます。両方を表示するには連鎖を使用してください。
def outer():
    try:
        inner()
    except ValueError as e:
        raise RuntimeError('outer failed') from e
def inner():
    raise ValueError('inner failed')
try:
    outer()
except RuntimeError as e:
    print(e, e.__cause__)

finally 内の例外

finally 内で例外を発生させると、元の例外が置き換えられます。絶対に必要な場合を除き、finally 内で例外を発生させないでください。
try:
    try:
        raise ValueError('original')
    finally:
        print('finally ran')
except ValueError as e:
    print('caught:', e)

warnings.warn と raise の違い

回復可能な軽微なエラーには warn() を、処理が必要なエラーには raise を使います。両者は異なる目的で使用します。
import warnings
def old_func():
    warnings.warn('Deprecated', DeprecationWarning)
    return 42
print(old_func())

raise from None パターン

ライブラリの例外を独自 API の例外でラップするときは、from None を使って内部の詳細が漏れるのを防ぎます。
class DBError(Exception): pass
def query(q):
    try:
        raise ConnectionError('refused')
    except ConnectionError:
        raise DBError('query failed') from None
try:
    query('SELECT 1')
except DBError as e:
    print(e)

クイックチェック

except ブロック内で、引数なしの 'raise' は何をしますか?

まとめ

raise Type('msg') はエラーを通知します。裸の raise は再送出を行います。raise New from Old は例外を連鎖させます。raise New from None はコンテキストを抑制します。assert は開発時の不変条件に使用します。

次へ進みましょう

よくできました。次のレッスンに進んで、学習を続けましょう。

よくある質問

「例外の発生と再発生」レッスンは無料ですか?

はい。「例外の発生と再発生」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。

「例外の発生と再発生」で何を学びますか?

raise でエラーを通知し、再発生させて上位へ伝播します。 ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Python Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「例外の発生と再発生」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このPython Academyレッスンでコードを書いて実行できますか?

はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 例外を理解する
  2. try / except / else / finally
  3. 例外の発生と再発生
  4. カスタム例外クラス
← Python Academyに戻る