Python で特定の例外が発生したかどうかを確認する方法

PythonPythonBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Python で特定の例外が発生したかどうかを確認する方法を学びます。この実験では、さまざまな例外タイプを理解し、それらを効果的に処理する方法に焦点を当てています。

Python スクリプトの実際の例を通じて、TypeErrorNameErrorIndexErrorKeyErrorValueErrorFileNotFoundError などの一般的な例外タイプを探索します。この実験では、exceptions_demo.py ファイルを作成し、try...except ブロックを使用して各例外タイプがどのように発生し、捕捉されるかを示すコードを追加する手順を案内します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/raising_exceptions("Raising Exceptions") python/ErrorandExceptionHandlingGroup -.-> python/custom_exceptions("Custom Exceptions") subgraph Lab Skills python/catching_exceptions -.-> lab-559566{{"Python で特定の例外が発生したかどうかを確認する方法"}} python/raising_exceptions -.-> lab-559566{{"Python で特定の例外が発生したかどうかを確認する方法"}} python/custom_exceptions -.-> lab-559566{{"Python で特定の例外が発生したかどうかを確認する方法"}} end

例外タイプについて学ぶ

このステップでは、Python のさまざまな例外タイプについて学びます。例外とは、プログラムの通常の実行フローを中断するイベントです。例外タイプを理解することは、エラーを効果的に処理するために重要です。

Python には多くの組み込み例外があり、独自の例外を作成することもできます。以下はいくつかの一般的な例外タイプです。

  • TypeError:不適切な型のオブジェクトに対して操作または関数が適用されたときに発生します。
  • NameError:ローカルまたはグローバル名前空間で名前が見つからないときに発生します。
  • IndexError:シーケンスの添字が範囲外のときに発生します。
  • KeyError:辞書のキーが見つからないときに発生します。
  • ValueError:操作または関数が正しい型であるが不適切な値の引数を受け取ったときに発生します。
  • FileNotFoundError:ファイルまたはディレクトリが要求されたが見つからないときに発生します。

いくつかの例を使ってこれらの例外タイプを探索しましょう。VS Code エディタを使用して、~/project ディレクトリに exceptions_demo.py という名前の Python スクリプトを作成します。

  1. VS Code を開きます。
  2. ~/project ディレクトリに exceptions_demo.py という名前の新しいファイルを作成します。
  3. exceptions_demo.py ファイルに以下のコードを追加します。
## TypeError
try:
    result = 1 + "a"
except TypeError as e:
    print(f"TypeError: {e}")

## NameError
try:
    print(undefined_variable)
except NameError as e:
    print(f"NameError: {e}")

## IndexError
try:
    my_list = [1, 2, 3]
    print(my_list[5])
except IndexError as e:
    print(f"IndexError: {e}")

## KeyError
try:
    my_dict = {"a": 1, "b": 2}
    print(my_dict["c"])
except KeyError as e:
    print(f"KeyError: {e}")

## ValueError
try:
    num = int("abc")
except ValueError as e:
    print(f"ValueError: {e}")

## FileNotFoundError
try:
    with open("nonexistent_file.txt", "r") as f:
        content = f.read()
except FileNotFoundError as e:
    print(f"FileNotFoundError: {e}")

このスクリプトは、try...except ブロックを使用してさまざまな例外タイプがどのように発生し、捕捉されるかを示しています。各 try ブロックには、特定の例外を引き起こす可能性のあるコードが含まれています。例外が発生すると、対応する except ブロックが実行されます。

では、このスクリプトを実行しましょう。

  1. VS Code でターミナルを開きます。
  2. ~/project ディレクトリに移動します。
cd ~/project
  1. python コマンドを使用して exceptions_demo.py スクリプトを実行します。
python exceptions_demo.py

以下の出力が表示されるはずです。

TypeError: unsupported operand type(s) for +: 'int' and 'str'
NameError: name 'undefined_variable' is not defined
IndexError: list index out of range
KeyError: 'c'
ValueError: invalid literal for int() with base 10: 'abc'
FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent_file.txt'

この出力は、各 try ブロックが予期された例外を発生させ、対応する except ブロックが例外メッセージを捕捉して表示したことを示しています。

さまざまな例外タイプを理解し、それらをどのように処理するかを知ることは、堅牢で信頼性の高い Python コードを書くために不可欠です。次のステップでは、特定の例外を捕捉し、適切に処理する方法を学びます。

特定の例外を捕捉する

前のステップでは、Python のさまざまな例外タイプについて学びました。今回は、try...except ブロックを使って特定の例外を捕捉する方法を学びます。これにより、異なるエラーを異なる方法で処理でき、コードをより堅牢にすることができます。

例外を捕捉する際には、できるだけ具体的にすることがベストプラクティスです。これにより、except ブロックが意図しない例外を誤って捕捉し、エラーを隠蔽してデバッグを困難にすることを防ぎます。

exceptions_demo.py スクリプトを変更して、文字列から整数への変換時に ValueError などの特定の例外を捕捉してみましょう。

  1. VS Code を使って ~/project ディレクトリ内の exceptions_demo.py ファイルを開きます。
  2. スクリプトを変更して、文字列から整数への変換時に ValueError のみを捕捉するようにします。
try:
    num = int("abc")
except ValueError as e:
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

この例では、int("abc") が失敗したときに発生する ValueError を具体的に捕捉しています。try ブロック内で他の例外が発生した場合、それは except Exception as e: ブロックで捕捉されます。print("Continuing execution...") 文は、例外が捕捉された場合に必ず実行され、例外を処理した後もプログラムが続行されることを示しています。

では、このスクリプトを実行しましょう。

  1. VS Code でターミナルを開きます。
  2. ~/project ディレクトリに移動します。
cd ~/project
  1. python コマンドを使って exceptions_demo.py スクリプトを実行します。
python exceptions_demo.py

以下の出力が表示されるはずです。

ValueError caught: invalid literal for int() with base 10: 'abc'
Continuing execution...

この出力は、ValueError が捕捉され、プログラムが続行されたことを示しています。

次に、スクリプトを変更して TypeError などの別の例外を発生させ、それがどのように処理されるかを見てみましょう。

  1. VS Code を使って ~/project ディレクトリ内の exceptions_demo.py ファイルを開きます。
  2. スクリプトを変更して TypeError を発生させます。
try:
    result = 1 + "a"
except ValueError as e:
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

再度スクリプトを実行します。

python exceptions_demo.py

以下の出力が表示されるはずです。

Some other exception: unsupported operand type(s) for +: 'int' and 'str'
Continuing execution...

この出力は、特定の except TypeError ブロックがないため、TypeErrorexcept Exception as e: ブロックで捕捉されたことを示しています。

特定の例外を捕捉することで、異なるエラーを異なる方法で処理でき、コードをより堅牢にし、デバッグを容易にすることができます。次のステップでは、例外インスタンスを検証する方法を学びます。

例外インスタンスを検証する

このステップでは、発生したエラーに関する詳細情報を取得するために、例外インスタンスを検証する方法を学びます。例外を捕捉すると、エラーの詳細を含む例外オブジェクト自体にアクセスすることができます。

exceptions_demo.py スクリプトを変更して、例外インスタンスの型と引数を出力してみましょう。

  1. VS Code を使って ~/project ディレクトリ内の exceptions_demo.py ファイルを開きます。
  2. スクリプトを変更して、ValueError 例外の型と引数を出力するようにします。
try:
    num = int("abc")
except ValueError as e:
    print(f"Exception type: {type(e)}")
    print(f"Exception arguments: {e.args}")
    print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

この例では、type(e) を使って例外オブジェクトの型を出力し、e.args を使って例外の引数を出力しています。e.args 属性は、例外のコンストラクタに渡された引数を含むタプルです。

では、このスクリプトを実行しましょう。

  1. VS Code でターミナルを開きます。
  2. ~/project ディレクトリに移動します。
cd ~/project
  1. python コマンドを使って exceptions_demo.py スクリプトを実行します。
python exceptions_demo.py

以下の出力が表示されるはずです。

Exception type: <class 'ValueError'>
Exception arguments: ("invalid literal for int() with base 10: 'abc'",)
ValueError caught: invalid literal for int() with base 10: 'abc'
Continuing execution...

この出力は、例外の型 (ValueError) と例外のコンストラクタに渡された引数(エラーメッセージを含むタプル)を示しています。

この情報を使って、より詳細なエラーメッセージを提供したり、例外の型と引数に基づいて特定のアクションを実行したりすることができます。

たとえば、例外の引数に特定のエラーメッセージが含まれているかどうかを確認することができます。

try:
    num = int("abc")
except ValueError as e:
    if "invalid literal" in e.args[0]:
        print("Invalid input: Please enter a valid number.")
    else:
        print(f"ValueError caught: {e}")
except Exception as e:
    print(f"Some other exception: {e}")

print("Continuing execution...")

この例では、ValueError 例外の最初の引数に文字列 "invalid literal" が含まれているかどうかを確認しています。含まれている場合は、より具体的なエラーメッセージを出力します。

例外インスタンスを検証することで、エラーをより賢く処理し、ユーザーにより有益なエラーメッセージを提供することができます。

まとめ

この実験では、最初のステップで Python のさまざまな例外タイプを理解することに焦点を当てています。これは、効果的なエラーハンドリングに不可欠です。実験では、TypeErrorNameErrorIndexErrorKeyErrorValueErrorFileNotFoundError などの一般的な組み込み例外が紹介されます。

その後、これらの例外がどのように発生し、try...except ブロックを使ってどのように捕捉されるかについての実践的な例が提供されます。exceptions_demo.py という名前の Python スクリプトが作成され、各例外タイプをデモンストレーションし、プログラムの正常な実行フローを妨げる可能性のある潜在的なエラーをどのように予測して処理するかを示しています。