Python 例外処理

例外処理

コンピューティングおよびコンピュータプログラミングにおける例外処理とは、特別な処理を必要とする異常な、または例外的な状態である例外の発生に対応するプロセスです。

Python には、プログラムがエラーに遭遇したときに発生する多くの組み込み例外があり、人気の高いRequestsのようなほとんどの外部ライブラリには、私たちが対処する必要のある独自のカスタム例外が含まれています。

基本的な例外処理

ゼロによる除算は数学的に真実であり、Python でそれを試みると、インタープリタは組み込み例外であるZeroDivisionErrorを発生させます。

def divide(dividend , divisor):
    print(dividend / divisor)

divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

プログラムの実行を停止させたくない、またはユーザーに理解できない出力を表示したくないとします。わかりやすく明確なメッセージを出力したい場合、tryキーワードとexceptキーワードを使用して例外を**処理**する必要があります。

# try-except: 例外を優雅に処理する
def divide(dividend , divisor):
    try:  # このコードを実行してみる
        print(dividend / divisor)
    except ZeroDivisionError:  # 特定の例外型をキャッチする
        print('You can not divide by 0')

divide(dividend=10, divisor=5)
2
divide(dividend=10, divisor=0)
You can not divide by 0
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

Python で例外を処理するために使用されるキーワードは何ですか?
A. try および except
B. catch および handle
C. error および rescue
D. if および else

1 つの例外ブロックを使用した複数の例外の処理

複数の例外を 1 行で処理することもでき、複数の例外ブロックを作成する必要はありません。

# 1 つの except ブロックで複数の例外を処理する
def divide(dividend , divisor):
    try:
        if (dividend == 10):
          var = 'str' + 1  # これは TypeError を発生させる
        else:
          print(dividend / divisor)
    except (ZeroDivisionError, TypeError) as error:  # 複数の例外型をキャッチする
        print(error)  # エラーメッセージを出力する

divide(dividend=20, divisor=5)
4
divide(dividend=10, divisor=5)
can only concatenate str (not "int") to str
divide(dividend=10, divisor=0)
division by zero
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

単一のexceptブロックで複数の例外タイプを処理できますか?
A. いいえ、各例外タイプに対して個別のexceptブロックを使用する必要があります
B. はい、except (Exception1, Exception2)のようにタプルに入れることで可能です
C. はい、ただしそれらが関連している場合に限ります
D. いいえ、Python はこれをサポートしていません

例外処理における Finally コード

finallyセクション内のコードは、例外が発生したかどうかにかかわらず、常に実行されます。

# finally ブロック:例外の発生に関係なく常に実行される
def divide(dividend , divisor):
    try:
        print(dividend / divisor)
    except ZeroDivisionError:
        print('You can not divide by 0')
    finally:  # 例外が発生しても常に実行される
        print('Execution finished')

divide(dividend=10, divisor=5)
2.0
Execution finished
divide(dividend=10, divisor=0)
You can not divide by 0
Execution finished
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

finallyブロックはいつ実行されますか?
A. 例外が発生した場合のみ
B. 例外が発生しなかった場合のみ
C. 例外が発生したかどうかにかかわらず、常に
D. 決して

カスタム例外

カスタム例外は、Python の基本のExceptionクラスを継承するclassを作成することによって初期化され、raiseキーワードを使用して発生させます。

# カスタム例外:Exception クラスから継承して作成
class MyCustomException(Exception):
    pass

raise MyCustomException  # カスタム例外を発生させる
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.MyCustomException

カスタム例外メッセージを宣言するには、それをパラメーターとして渡すことができます。

class MyCustomException(Exception):
    pass

raise MyCustomException('A custom message for my custom exception')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.MyCustomException: A custom message for my custom exception

カスタム例外の処理は、他の例外と同じです。

try:
    raise MyCustomException('A custom message for my custom exception')
except MyCustomException:
    print('My custom exception was raised')
My custom exception was raised
クイズ

ログインしてこのクイズに回答し、学習の進捗を追跡できます

Python でカスタム例外を作成するにはどうすればよいですか?
A. Exceptionクラスを継承するクラスを作成する
B. @exceptionデコレータを使用する
C. Exception.create()を呼び出す
D. 特別なモジュールからインポートする

関連リンク