PR

【Python】raise文の使い方を3分でわかりやすく解説

Python

Pythonのraise文は、特定の例外を手動で発生させるために利用します。raise文を適切に利用することで、エラーハンドリングや特定の条件下で複雑なプログラムの制御が可能になります。

def divide(x, y):
    if y == 0:
        raise ValueError("0で割ることはできません。")
    return x / y

try:
    result = divide(10, 0)
except ValueError as e:
    print(e)

参考 def文(関数) / try-except

上記のコードでは、0による除算が試みられたときに、明示的にValueError例外を引き起こしています。これにより、エラーが発生した理由を具体的に知ることができ、適切なエラーハンドリングを行うことができます。

Pythonのraise文は、エラーや例外条件をプログラム内で明示的に引き起こすためのもので、これによりプログラムの実行を特定の条件下で制御したり、特定のエラーを発生させたりすることが可能となります。

このページではraise文の使い方やコツ、利用する際の注意点をサンプルコード付きでわかりやすく解説します。

このページで学べる内容
  • raise文の使い方
  • raise文を利用するメリット・使いどころやコツ
  • raise文を利用する際の注意点

Pythonエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。

参考 Pythonの基本的な書き方・構文ルール

スポンサーリンク

Python:raise文

Pythonのraise文はエラーや例外条件をプログラム内で明示的に引き起こすためのものです。

これによりプログラムの実行を特定の条件下で制御したり、特定のエラーを発生させたりすることが可能となります。

また、例外の型や例外オブジェクトを指定して任意の例外を発生させることができる他、直前の例外を再度発生させることも可能です。エラーが発生した理由を具体的に知ることができ、適切なエラーハンドリングを行うことができます。

Python:raise文の構文ルール

Pythonのraise文は主に3つの形式で使用されます。

パターン① 例外オブジェクトを指定して例外を発生させる

raise ValueError("Invalid value")

この形式では、raise文の後に具体的な例外オブジェクトを指定します。例外オブジェクトは通常、Exceptionクラスかそのサブクラスのインスタンスです。

上記のコードは、ValueErrorという特定の種類の例外を発生させ、その際に"Invalid value"というエラーメッセージを付けています。

パターン2 例外の型を指定して例外を発生させる

raise ValueError("Invalid value")

この形式では、raise文の後に例外の型(Exceptionクラスまたはそのサブクラス)を指定します。その後、括弧()内にエラーメッセージを記述します。

ここでも、ValueErrorという例外を発生させており、その際に"Invalid value"というエラーメッセージを付けています。

パターン3 直前の例外を再度発生させる

try:
    # 何らかの処理...
except Exception:
    # 何らかの処理...
    raise  # 直前の例外を再度発生させる

この形式では、raise文は単体で使用されます。このraise文は、直前の例外(try/exceptブロックで捕捉した例外)を再度発生させます。

これは通常、例外を捕捉して何かの処理を行った後で、その例外を上位のコードに再度伝播させるために使用します。

Python:raise文の使い方

それでは、raise文の意味や基本を押さえたところで、より実践的な利用方法をサンプルコード付きで解説していきます。

以下のサンプルコードは、特定のエラー条件に対してraise文を使用することで例外を明示的に発生させ、それを捕捉してエラーメッセージを出力するかを示しています。また、直前の例外を再度raiseすることで、その例外を上位のコードに伝播させる方法も示しています。

サンプル1 例外オブジェクトを指定して例外を発生させる

class MyException(Exception):
    pass

def do_something(data):
    if data is None:
        # MyExceptionを例外オブジェクトとしてraise
        raise MyException("データがNoneです。処理を続行できません。")

try:
    do_something(None)
except MyException as e:
    print(f"エラーが発生しました: {e}")

参考 クラスの使い方 / if文 / f-ストリング

サンプルコード1のポイント
  • 自作の例外クラスMyExceptionを定義し、そのインスタンスをraiseしています。
  • dataNoneの場合、MyExceptionをraiseしています。エラーメッセージとして"データがNoneです。処理を続行できません。"を付けています。
  • この例外はtry-exceptブロックで捕捉され、エラーメッセージが出力されます。

サンプル2 例外の型を指定して例外を発生させる

def process_file(filename):
    if not filename.endswith('.txt'):
        # ValueErrorを例外の型としてraise
        raise ValueError("ファイルの拡張子が.txtでなければなりません。")

try:
    process_file("example.pdf")
except ValueError as e:
    print(f"エラーが発生しました: {e}")
サンプルコード2のポイント
  • このコードでは、ファイル名が".txt"で終わらない場合、ValueErrorをraiseしています。
  • エラーメッセージとして"ファイルの拡張子が.txtでなければなりません。"を付けています。
  • このValueErrortry-exceptブロックで捕捉され、エラーメッセージが出力されます。

サンプル3 直前の例外を再度発生させる

def divide(x, y):
    try:
        result = x / y
    except ZeroDivisionError as e:
        print("ゼロ除算エラーを検出しました。再度エラーをraiseします。")
        raise  # ゼロ除算エラーを再度raise
    else:
        return result

try:
    divide(10, 0)
except ZeroDivisionError:
    print("ゼロ除算エラーが上位のブロックでも捕捉されました。")
サンプルコード3のポイント
  • このコードでは、ZeroDivisionError(ゼロ除算エラー)を捕捉し、その後で同じ例外を再度raiseしています。
  • ZeroDivisionErrortry-exceptブロックで捕捉され、エラーメッセージ"ゼロ除算エラーを検出しました。再度エラーをraiseします。"が出力されます。
  • 続いて、同じZeroDivisionErrorが再度raiseされ、上位のtry-exceptブロックで捕捉され、エラーメッセージ"ゼロ除算エラーが上位のブロックでも捕捉されました。"が出力されます。

Python:raise文を利用する際の注意点

Pythonのraise文を使用する際には、以下の点に注意する必要があります。

  • 注意点1 適切な例外の選択

    Pythonには組み込みの例外クラスが多数用意されています(ValueError, TypeError, IndexErrorなど)。例外をraiseする際は、エラーの状況に最も適した例外クラスを選ぶことが重要です。これにより、エラーハンドリングがより正確になり、他の開発者がコードを理解しやすくなります。
  • 注意点2 エラーメッセージの明確さ

    例外をraiseする際には、具体的なエラーメッセージを提供することが重要です。このメッセージは、何が起こったのか、どのようなアクションが引き金となったのか、どのように修正すればよいのかなど、問題の解決に役立つ情報を含むべきです。
  • 注意点3 例外の適切な捕捉

    例外をraiseしたら、それを適切に捕捉するためのtry/exceptブロックが必要です。例外を捕捉せずに放置すると、プログラムはクラッシュし、予期せぬ結果を引き起こす可能性があります。
  • 注意点4 例外の過度な使用

    例外は、本当に"例外的な"状況、つまり、通常のプログラムのフローでは対処できない状況で使用するべきです。例外をコントロールフローの一部として過度に使用すると、コードの可読性や保守性が低下します。
  • 注意点5 再発生させる例外の選択

    特定の例外を捕捉し、処理を行った後でその例外を再発生させる場合、raise文をそのまま使います。ただし、このとき注意すべきは、再発生させる例外が正しいものであること、つまり直前に捕捉した例外であることです。raise文を使って新しい例外を発生させてしまうと、元の例外が失われ、エラーの原因を特定するのが困難になる可能性があります。

以下に1つわかりやすい例を挙げてみました。どこが改善点であるか?考えながらコードを確認してみてください。

サンプル 良くない例

def divide(x, y):
    if y == 0:
        raise Exception

try:
    divide(10, 0)
except:
    pass

分かりましたでしょうか。具体的には3点にわたって改善ポイントが存在します。

1つ目。divide関数では、ゼロ除算エラーの可能性があるにもかかわらず、具体的な例外クラスやエラーメッセージを提供せずにExceptionを直接raiseしています。これでは、何が問題でどう修正すれば良いのかが明確でないため、デバッグが難しくなります。

2つ目。try-exceptブロックで、何の例外を捕捉するのかが明示されていません。これでは、予期せぬ例外まで捕捉してしまう可能性があります。

3つ目。例外が捕捉されたときに何も行われていません(pass)。これでは、例外が発生したこと自体が無視されてしまい、エラーハンドリングが適切に行われていないと言えます。

上記のサンプルコードは以下の通りに改善する必要があります。

def divide(x, y):
    if y == 0:
        raise ZeroDivisionError("ゼロ除算エラー:yが0です。")

try:
    divide(10, 0)
except ZeroDivisionError as e:  # ゼロ除算エラーを明示的に捕捉
    print(f"エラーが発生しました: {e}")  # エラーメッセージを出力

Python:raise文のまとめ

Python:raise文のまとめ
  • raise文はプログラム内で明示的に例外を発生させるためのPythonの構文です。
  • raise文を利用することで開発者は特定のエラー条件に遭遇したときに自分で例外を発生させることができます。
  • 例外は特定のエラー型(例:ValueErrorTypeErrorなど)を指定することで発生させます。
  • raise文を使って直前に捕捉した例外を再度発生させることもできます。
  • raise文は通常、try/exceptブロック内で使用され、エラーハンドリングの一部として利用されます。
class IndexErrorWithMessage(IndexError):
    """メッセージ付きインデックスエラーのカスタム例外クラス"""
    pass

def get_element_from_list(list_, index):
    """リストから要素を取得します。指定のインデックスに要素が存在しない場合、カスタム例外を発生させます。"""
    try:
        return list_[index]
    except IndexError:
        raise IndexErrorWithMessage(f"指定のインデックス({index})には要素が存在しません。")

my_list = [1, 2, 3]

try:
    print(get_element_from_list(my_list, 10))  # 存在しないインデックス
except IndexErrorWithMessage as e:
    print(f"エラーが発生しました: {e}")

参考 リストとは?

始めてPythonを勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。

Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!

読者料典 Python入門:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
Python
シェアする
ビズドットオンラインをフォローする
タイトルとURLをコピーしました