Categories: Python

【Python】明示的に例外(エラー)を発生させるraise文の使い方

この記事では、Pythonで例外(エラー)を発生させるraise文の使い方を解説します。

明示的にエラーを発生させることで以下のようなメリットがあります。

  • 任意の型のエラーを投げれる
  • 関数内などで発生させることで呼び出し元に例外処理させられる

それでは、raise文の使い方を確認してどのように使用できるのか見ていきましょう!

例外(エラー)を発生させる

例外を自発的に発生させるには、raise文を使います。

raise 例外クラス

()内に文字列を記述することでメッセージを渡すことができます。

raise 例外クラス(メッセージ)

試しに例外を発生させてみます。

raise SyntaxError

実行結果

Traceback (most recent call last):
  File "/Users/user/Desktop/Python/main.py", line 2, in 
    raise SyntaxError
SyntaxError: None

Tracebackが表示され、SyntaxErrorが発生しました。

今回は、なんとなくSyntaxErrorを指定しましたが、あらかじめ様々な型が用意されているので適切なものを選んで発生させてください。→ 組み込み例外

メッセージを添えることでより例外が発生した原因がわかりやすくなります。

raise ValueError('例外が発生')

実行結果

Traceback (most recent call last):
  File "/Users/user/Desktop/Python/main.py", line 1, in 
    raise ValueError('例外が発生')
ValueError: 例外が発生

このように、raise文を使うことで簡単に例外を発生させることができました。

呼び出し元に例外を投げる

関数内でraise文を使って例外を発生させることで例外を呼び出し元に投げることができます。

def func():
    raise ValueError('ValueErrorが発生!')


try:
    func()
except ValueError as e:
    print(e)

実行結果

ValueErrorが発生!

実際に使用する際には、if文で分岐させたり、try文を使ったりします。

# if文の例
def func():
    if 条件:
        raise 例外クラス

# try文の例
def func():
    try:
        エラーが起きそうな処理
    except:
        raise

関数内に例外処理を実装してしまうと処理が固定化されてしまい柔軟性に欠ける。なので、raise文を使って呼び出し元に例外を投げることで柔軟性の高いコードとなる。

ちなみにraise文は、式などを指定せず、そのまま記述することで現在処理している例外を再度発生させることができる(アクティブ例外)。

ユーザー定義例外

独自の例外を発生させたい場合は、Exceptionクラスを直接的、または間接的に継承させたユーザー定義例外を作成することで実装することができます。

# ユーザー定義例外
class MyError(Exception):
    pass

try:
    raise MyError
except:
    print('MyError発生!')

実行結果

MyError発生!

()を使ってエラーメッセージを指定することもできる。

class MyError(Exception):
    pass

try:
    raise MyError('Error')  # エラーメッセージ
except MyError as e:
    print(e)

実行結果

Error

エラーメッセージを固定したい場合は、__str__メソッドで文字列を返すことで定義できる。

class MyError(Exception):
    def __str__(self) -> str:
        return 'MyError'  # エラーメッセージ 

try:
    raise MyError('Error')
except MyError as e:
    print(e)

実行結果

MyError

まとめ

この記事では、Pythonで例外を明示的に発生させる方法を解説しました。

関数などを自作する際に、明示的に例外を発生させることで使用方法を限定したり、例外処理に繋げたりと、意外と色々な処理を実装することができます。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago