はじめに
この実験では、Python で例外メッセージを探索し、アクセスする方法を学び、効果的にデバッグしてエラーを処理する方法を学びます。この実験では、try...except ブロックを使用して除算中の潜在的な例外をキャッチする divide 関数を持つ Python スクリプトの作成をガイドします。ZeroDivisionError や TypeError などのさまざまなタイプの例外が、特定のエラーメッセージを生成する様子を観察します。
次に、この実験では、例外オブジェクトとそのタイプにアクセスして、エラーに関するより詳細な情報を取得する方法を示します。異なる入力でスクリプトを実行することで、例外メッセージがエラーの原因に関する貴重な洞察を提供し、コード内の問題を特定して修正できるようになります。
例外メッセージを調査する
このステップでは、Python で例外メッセージを探索する方法を学びます。例外メッセージは、コードで何が問題になったかに関する貴重な情報を提供し、デバッグとエラー修正に役立ちます。
まず、VS Code エディタを使用して、~/project ディレクトリに exceptions.py という名前の Python ファイルを作成しましょう。
## exceptions.py
def divide(x, y):
try:
result = x / y
print("The result is:", result)
except Exception as e:
print("An error occurred:", e)
divide(10, 2)
divide(10, 0)
divide("hello", 5)
このコードでは:
xをyで割る試みを行うdivide(x, y)関数を定義しています。try...exceptブロックを使用して、除算中に発生する可能性のあるすべての例外をキャッチします。- 例外が発生した場合、例外オブジェクト
eとともにエラーメッセージを出力します。
次に、python コマンドを使用して exceptions.py スクリプトを実行しましょう:
python exceptions.py
以下の出力が表示されるはずです:
The result is: 5.0
An error occurred: division by zero
An error occurred: unsupported operand type(s) for /: 'str' and 'int'
ご覧のとおり、最初の divide(10, 2) の呼び出しは正常に実行され、結果が出力されます。2 番目の呼び出し divide(10, 0) は division by zero 例外を発生させ、これは except ブロックでキャッチされ、対応するエラーメッセージが出力されます。3 番目の呼び出し divide("hello", 5) は、文字列と整数を除算することができないため、TypeError を発生させます。
次に、exceptions.py ファイルを修正して、例外のタイプを出力するようにしましょう:
## exceptions.py
def divide(x, y):
try:
result = x / y
print("The result is:", result)
except Exception as e:
print("An error occurred:", type(e), e)
divide(10, 2)
divide(10, 0)
divide("hello", 5)
再度スクリプトを実行します:
python exceptions.py
以下の出力が表示されるはずです:
The result is: 5.0
An error occurred: <class 'ZeroDivisionError'> division by zero
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'
この出力は、発生した各例外のタイプを示しており、デバッグにさらに多くの情報を提供します。
例外の引数にアクセスする
このステップでは、Python で例外に関連付けられた引数(args)にアクセスする方法を学びます。例外の引数は、発生したエラーに関するより具体的な詳細を提供することができます。
前のステップで作成した exceptions.py ファイルを修正して、例外の引数にアクセスして出力するようにしましょう。VS Code エディタを使用して、~/project ディレクトリ内の exceptions.py を開きます。
## exceptions.py
def divide(x, y):
try:
result = x / y
print("The result is:", result)
except Exception as e:
print("An error occurred:", type(e), e.args)
divide(10, 2)
divide(10, 0)
divide("hello", 5)
このコードでは、except ブロックを修正して e.args を出力するようにしています。args 属性は、例外のコンストラクタに渡された引数を含むタプルです。
次に、exceptions.py スクリプトを実行しましょう:
python exceptions.py
以下の出力が表示されるはずです:
The result is: 5.0
An error occurred: <class 'ZeroDivisionError'> ('division by zero',)
An error occurred: <class 'TypeError'> ("unsupported operand type(s) for /: 'str' and 'int'",)
ご覧のとおり、出力には各例外に関連付けられた引数が含まれています。ZeroDivisionError の場合、引数は 'division by zero' という文字列を含むタプルです。TypeError の場合、引数は "unsupported operand type(s) for /: 'str' and 'int'" という文字列を含むタプルです。
再度 exceptions.py ファイルを修正して、最初の引数に直接アクセスするようにしましょう:
## exceptions.py
def divide(x, y):
try:
result = x / y
print("The result is:", result)
except Exception as e:
print("An error occurred:", type(e), e.args[0])
divide(10, 2)
divide(10, 0)
divide("hello", 5)
再度スクリプトを実行します:
python exceptions.py
以下の出力が表示されるはずです:
The result is: 5.0
An error occurred: <class 'ZeroDivisionError'> division by zero
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'
e.args[0] にアクセスすることで、例外の最初の引数を抽出することができます。これは、エラーメッセージの中で最も説明的な部分であることが多いです。
メッセージ文字列を一致させる
このステップでは、Python で例外のメッセージ文字列にマッチさせる方法を学びます。例外のメッセージに基づいて特定の種類の例外を異なる方法で処理したい場合に便利です。
これまで作業していた exceptions.py ファイルを修正して、ZeroDivisionError を具体的にキャッチし、カスタムメッセージを出力するようにしましょう。VS Code エディタを使用して、~/project ディレクトリ内の exceptions.py を開きます。
## exceptions.py
def divide(x, y):
try:
result = x / y
print("The result is:", result)
except ZeroDivisionError as e:
print("Cannot divide by zero!")
except Exception as e:
print("An error occurred:", type(e), e.args[0])
divide(10, 2)
divide(10, 0)
divide("hello", 5)
このコードでは:
ZeroDivisionError用の特定のexceptブロックを追加しています。ZeroDivisionErrorが発生した場合、「Cannot divide by zero!」というメッセージを出力します。- 汎用の
except Exception as eブロックは、その他の例外をキャッチします。
次に、exceptions.py スクリプトを実行しましょう:
python exceptions.py
以下の出力が表示されるはずです:
The result is: 5.0
Cannot divide by zero!
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'
ご覧のとおり、divide(10, 0) が呼び出されると、ZeroDivisionError は特定の except ブロックでキャッチされ、カスタムメッセージ「Cannot divide by zero!」が出力されます。divide("hello", 5) で発生した TypeError は、依然として汎用の except ブロックでキャッチされます。
また、メッセージ文字列に直接マッチさせることもできますが、一般的には特定の例外タイプをキャッチするよりも推奨されません。以下はその方法です:
## exceptions.py
def divide(x, y):
try:
result = x / y
print("The result is:", result)
except Exception as e:
if "division by zero" in str(e):
print("Cannot divide by zero!")
else:
print("An error occurred:", type(e), e.args[0])
divide(10, 2)
divide(10, 0)
divide("hello", 5)
このコードでは:
- 汎用の
exceptブロックですべての例外をキャッチします。 - 例外オブジェクト
eの文字列表現に「division by zero」という文字列が含まれているかどうかを確認します。 - 含まれている場合は、「Cannot divide by zero!」を出力します。それ以外の場合は、汎用のエラーメッセージを出力します。
再度スクリプトを実行します:
python exceptions.py
前と同じ出力が表示されるはずです:
The result is: 5.0
Cannot divide by zero!
An error occurred: <class 'TypeError'> unsupported operand type(s) for /: 'str' and 'int'
メッセージ文字列をマッチさせることは、いくつかのケースで便利なことがありますが、例外メッセージは変更される可能性があり、コードの信頼性が低下するため、一般的には特定の例外タイプをキャッチする方が良いです。
まとめ
この実験では、Python の例外メッセージを調べ、エラーのデバッグと修正方法を理解しました。try...except ブロックを使用して、除算演算中の例外をキャッチし、例外オブジェクト e を出力してエラーメッセージを表示する方法を学びました。
また、スクリプトを修正して例外の種類を出力することで、ZeroDivisionError や TypeError など、遭遇したエラーの性質についてさらに深く理解することができました。これにより、より的を絞ったデバッグとエラー処理が可能になります。



