1.1 エラーの発生
エラー(例外)はプログラミングにとって避けられないものだよね。 それは、プログラムが 予期しない状況に直面したときに発生して、 処理できないんだ。Pythonでは、エラーをキャッチして処理するための 例外処理のシステムがあって、プログラムが終了しないようにすることができるんだ。
例外は主に次のような状況で発生することが多いよ:
構文エラー:
これはコードのコンパイル時に発見されるエラーで、Python言語の文法が間違っているときに起こるんだ。例えば、コロンが抜けていたり、キーワードが間違っていたりするときとかね。
if True:
print("Hello")
実行時エラー (Runtime Errors
):
これらはプログラム実行中に発生するエラーで、ゼロで割ったり、存在しないリストのインデックスにアクセスしたり、データ型を間違えて使ったりするときに起こるんだ。
print(1 / 0) # ZeroDivisionError
論理エラー:
これらのエラーは、プログラムが正常に動作しているように見えても、プログラムの論理が間違っているために間違った結果を出すときに発生するんだ。論理エラーは例外を引き起こさないので、デバッグが難しいんだよね。
論理エラーは普通はバグと呼ばれて、プログラムの機能に何かしらの未完成がある感じかな。実行時エラーは例外と呼ばれていて、こういうエラーのためにPythonは特別なオブジェクト(例外)を作ってプログラムに「投げる」んだ...
1.2 例外の流れ
Pythonで例外が発生したとき、それはスタックトレースを通じて処理されるまで上がっていくんだ。スタックトレースは、例外が発生した関数呼び出しの順序を示してるんだよね。
例外の上昇メカニズム
- 例外の発生: エラーが起きると、Pythonは例外オブジェクトを作るんだ。
- 例外ハンドラの検索: Pythonのインタプリタは、現在のコードブロックで例外ハンドラを探し始める。もし見つからなければ、現在の関数を呼び出した次のコードブロックに移るんだ。
- 例外をスタックで上昇させる: このプロセスはハンドラが見つかるまで繰り返されるか、スタックがなくなるまで続くんだ。
- プログラムの終了: ハンドラが見つからない場合、プログラムは終了してエラーメッセージを表示するんだ。
例:
def func_a():
func_b()
def func_b():
func_c()
def func_c():
print(1 / 0) # ここでZeroDivisionError例外が発生するよ
func_a()
この例では、ZeroDivisionError
例外がfunc_c
関数で発生し、func_b
とfunc_a
を通じてスタックトレースを上昇していくんだ。どこにもハンドラが見つからなければ、プログラムはエラーで終了するよ。
1.3 ログの読み方
プログラムが未処理の例外のために終了したとき、Pythonはスタックトレース(traceback)を出力してくれる。これで開発者は何が問題だったのか理解の手助けをできるんだ。スタックトレースには、例外を引き起こした関数呼び出しの順序が含まれていて、プログラムのデバッグに分析できる。
スタックトレースの例
Traceback (most recent call last):
File "example.py", line 10, in
func_a() File "example.py", line 2, in func_a func_b() File "example.py", line 5, in func_b func_c() File "example.py", line 8, in func_c print(1 / 0) ZeroDivisionError: division by zero
スタックトレースの分析
- 例外の種類とメッセージ: トレースの最後には、例外の種類とメッセージが示される。今回の例では
ZeroDivisionError: division by zero
だね。 - 呼び出しの順序: スタックトレースは関数呼び出しの順序を示している。今回の例では、
func_c
関数のprint(1 / 0)
行でエラーが発生し、それがfunc_b
から呼び出されたことが示されてるんだね。そしてfunc_a
がその前に呼ばれている。 - ファイルとコード行番号: 各トレース行には、呼び出しが行われたファイルと行番号が示されている。これがコードのエラーを素早く見つけて修正する手助けになるんだ。
スタックトレースの実用的な使用
スタックトレースはプログラムをデバッグして分析するために重要なツールだよ。それを使うことで、開発者はエラーの原因を理解し、どのコードの部分で問題が発生したか見つけることができる。以下はいくつかのスタックトレースを利用したヒントだよ:
- 下から上に読む: トレースの一番下の呼び出しから分析を始めて、そこが例外が発生した場所だからね。
- すべての呼び出しを確認する: トレース内のすべての呼び出しを調べて、例外がどのように伝わったかを理解しよう。
- コードの修正: トレースの情報を使ってコードを修正し、同様のエラーが将来発生しないようにしよう。
次のレクチャーでは例外についてもっと詳しく学ぶよ。
GO TO FULL VERSION