Pythonのtry-exceptについて深掘り

例外とエラーの違い

Pythonでは、プログラムが予期しない状況に遭遇したときに発生するのが「エラー」です。エラーはさまざまな形で発生します。例えば、存在しない変数を参照しようとしたり、0で除算しようとしたりするとエラーが発生します。

一方、「例外」はエラーの一種で、プログラムの実行中に発生する予期しない状況を表します。しかし、「例外」は「エラー」よりも広い概念で、エラーだけでなく、プログラムの流れを制御するための手段としても使われます。

Pythonでは、エラーが発生すると通常はプログラムが停止します。しかし、「try-except」構文を使うと、特定のエラーが発生したときにプログラムが停止するのを防ぎ、代わりに特定の処理を行うことができます。これにより、エラーを「例外」として扱い、プログラムの安定性と信頼性を向上させることができます。この「try-except」構文の詳細については、次のセクションで説明します。

try-exceptの基本的な使い方

Pythonのtry-except構文は、エラーが発生する可能性のあるコードをtryブロック内に書き、そのエラーをexceptブロックで捕捉します。基本的な形式は以下のようになります。

try:
    # エラーが発生する可能性のあるコード
except エラーの種類:
    # エラーが発生したときの処理

例えば、0で除算するとZeroDivisionErrorが発生しますが、これをtry-exceptで捕捉すると以下のようになります。

try:
    x = 1 / 0
except ZeroDivisionError:
    x = 0
    print("0で除算しようとしました。xを0に設定します。")

このコードでは、1 / 0という0での除算を試みています。通常、これはZeroDivisionErrorを引き起こし、プログラムは停止します。しかし、try-except構文を使用することで、このエラーを捕捉し、代わりにxを0に設定し、エラーメッセージを表示します。このように、try-except構文を使うと、エラーが発生したときにプログラムが停止するのを防ぎ、代わりに特定の処理を行うことができます。

故意に例外を発生させる方法:raise

Pythonでは、raiseステートメントを使用して故意に例外を発生させることができます。これは、特定の条件が満たされない場合にプログラムを停止させたいときや、エラーを通知したいときに便利です。

raiseステートメントの基本的な使い方は以下のようになります。

raise Exception("エラーメッセージ")

このコードは、Exceptionという種類の例外を発生させ、エラーメッセージとして"エラーメッセージ"を表示します。

例えば、関数の引数が正の整数であることを期待しているが、負の値が渡された場合に例外を発生させることができます。

def positive_square(n):
    if n < 0:
        raise ValueError("nは正の数である必要があります")
    return n ** 2

この関数positive_squareは、引数nが負の数である場合、ValueErrorを発生させます。このように、raiseステートメントを使用すると、プログラムの実行を制御し、エラーを明示的に通知することができます。

例外オブジェクトを取得する方法

Pythonのtry-except構文では、exceptブロックで例外オブジェクトを取得することができます。これにより、発生した例外に関する詳細な情報を得ることができます。

例外オブジェクトを取得する基本的な形式は以下のようになります。

try:
    # エラーが発生する可能性のあるコード
except エラーの種類 as e:
    # eは例外オブジェクト

例えば、0で除算するとZeroDivisionErrorが発生しますが、これをtry-exceptで捕捉し、例外オブジェクトを取得すると以下のようになります。

try:
    x = 1 / 0
except ZeroDivisionError as e:
    print("エラーが発生しました:", e)

このコードでは、1 / 0という0での除算を試みています。通常、これはZeroDivisionErrorを引き起こし、プログラムは停止します。しかし、try-except構文を使用することで、このエラーを捕捉し、例外オブジェクトeを取得します。そして、エラーメッセージとして"エラーが発生しました:"と例外オブジェクトeを表示します。このように、try-except構文を使うと、エラーが発生したときにプログラムが停止するのを防ぎ、代わりに特定の処理を行うことができます。

複数の例外をキャッチする方法

Pythonのtry-except構文では、複数の例外をキャッチすることができます。これにより、異なる種類のエラーが発生したときにそれぞれ異なる処理を行うことができます。

複数の例外をキャッチする基本的な形式は以下のようになります。

try:
    # エラーが発生する可能性のあるコード
except エラーの種類1:
    # エラーの種類1が発生したときの処理
except エラーの種類2:
    # エラーの種類2が発生したときの処理

例えば、以下のコードでは、ZeroDivisionErrorTypeErrorの2つの例外をキャッチしています。

try:
    x = 1 / "0"
except ZeroDivisionError:
    print("0で除算しようとしました。")
except TypeError:
    print("数値以外のオブジェクトで除算しようとしました。")

このコードでは、1 / "0"という数値と文字列の除算を試みています。通常、これはTypeErrorを引き起こし、プログラムは停止します。しかし、try-except構文を使用することで、このエラーを捕捉し、エラーメッセージとして"数値以外のオブジェクトで除算しようとしました。"を表示します。このように、try-except構文を使うと、複数のエラーが発生したときにそれぞれ異なる処理を行うことができます。

すべての例外をキャッチする方法

Pythonのtry-except構文では、すべての例外をキャッチすることができます。これにより、発生した例外の種類に関係なく、一律の処理を行うことができます。

すべての例外をキャッチする基本的な形式は以下のようになります。

try:
    # エラーが発生する可能性のあるコード
except:
    # すべての例外が発生したときの処理

例えば、以下のコードでは、すべての例外をキャッチしています。

try:
    x = 1 / "0"
except:
    print("エラーが発生しました。")

このコードでは、1 / "0"という数値と文字列の除算を試みています。通常、これはTypeErrorを引き起こし、プログラムは停止します。しかし、try-except構文を使用することで、このエラーを捕捉し、エラーメッセージとして"エラーが発生しました。"を表示します。このように、try-except構文を使うと、発生した例外の種類に関係なく、一律の処理を行うことができます。

ただし、この方法はすべての例外を一律に処理するため、どの種類のエラーが発生したのか特定できないという欠点があります。そのため、通常は特定のエラーをキャッチする方法を使用し、最終的なexceptブロックで未捕捉の例外をキャッチするという使い方が推奨されます。

例外をキャッチした後の処理

Pythonのtry-except構文では、例外をキャッチした後に特定の処理を行うことができます。これはfinallyブロックを使用して行います。

finallyブロックの基本的な形式は以下のようになります。

try:
    # エラーが発生する可能性のあるコード
except エラーの種類:
    # エラーが発生したときの処理
finally:
    # 例外が発生しようとしまいと、最後に必ず実行される処理

例えば、以下のコードでは、ファイルを開き、その内容を表示し、最後にファイルを閉じる処理を行っています。

try:
    f = open("file.txt", "r")
    print(f.read())
except FileNotFoundError:
    print("ファイルが見つかりませんでした。")
finally:
    f.close()

このコードでは、open関数でファイルを開き、readメソッドでその内容を表示しています。もしファイルが存在しない場合、FileNotFoundErrorが発生し、エラーメッセージとして"ファイルが見つかりませんでした。"を表示します。そして、finallyブロックでファイルを閉じる処理を行います。このfinallyブロックの処理は、例外が発生しようとしまいと、最後に必ず実行されます。このように、try-except-finally構文を使うと、例外をキャッチした後に特定の処理を行うことができます。

Comments

No comments yet. Why don’t you start the discussion?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です