この章では、Pythonプログラムでエラーが発生した際に、それを適切に処理し、デバッグする方法について学びます。例外処理は、予期しないエラーが発生した場合でもプログラムがクラッシュしないようにするために重要です。また、エラーを見つけやすくするデバッグ技術についても解説します。
10.1 例外の基本 (try, catch, finally)
Pythonでは、エラーや例外が発生したときにプログラムがクラッシュしないようにするために、try-except
構文を使います。
基本構文
try:
# エラーが発生する可能性のあるコード
1 / 0
except ZeroDivisionError:
# エラーが発生した場合の処理
print("ゼロで割ることはできません。")
finally:
# 例外の有無に関わらず実行されるコード
print("プログラムが終了しました。")
このコードでは、ZeroDivisionError
が発生した場合に、それをキャッチしてエラーメッセージを表示し、finally
ブロックで必ず「プログラムが終了しました」と出力します。
10.2 カスタム例外の作成と使用
独自のエラーメッセージを表示したい場合、カスタム例外を定義することができます。Pythonの組み込み例外クラスを継承して独自の例外クラスを作成します。
カスタム例外の定義
class CustomError(Exception):
def __init__(self, message):
self.message = message
def check_value(value):
if value < 0:
raise CustomError("値が負です。")
try:
check_value(-1)
except CustomError as e:
print(e.message)
このコードでは、CustomError
というカスタム例外を定義し、check_value
関数で負の値が入力されたときに例外を発生させています。
10.3 例外の再スローと連鎖
例外の再スローとは、except
ブロック内でキャッチした例外を再度スローすることです。これにより、元のエラーを処理しながら、新たにエラーを発生させることができます。
例外の再スロー
try:
1 / 0
except ZeroDivisionError as e:
print("例外をキャッチしました。")
raise # 再スロー
この例では、ZeroDivisionError
が発生した後、キャッチしてメッセージを表示しますが、その後例外を再スローして処理を終了させます。
10.4 デバッグの基本 (ブレークポイント、ウォッチ)
デバッグは、プログラムの問題を発見し、修正するための重要な技術です。Pythonでは、pdb
(Python Debugger)モジュールを使ってデバッグを行うことができます。
ブレークポイントの設定
import pdb
def calculate(a, b):
pdb.set_trace() # ブレークポイントを設定
return a / b
calculate(10, 0)
この例では、pdb.set_trace()
を使ってブレークポイントを設定し、コードの実行を一時停止してデバッグモードに入ることができます。
10.5 ログの作成とエラーハンドリングのベストプラクティス
大規模なアプリケーションでは、エラーや重要な情報を記録しておくためにログを作成することが推奨されます。Pythonには、ログを作成するための標準モジュールlogging
があります。
基本的なログの使用例
import logging
# ログの設定
logging.basicConfig(level=logging.INFO)
def divide(a, b):
try:
return a / b
except ZeroDivisionError:
logging.error("ゼロで割ることはできません。")
return None
divide(10, 0)
この例では、エラーが発生した際に、logging.error()
を使ってエラーメッセージをログに記録します。logging.basicConfig()
でログの基本設定を行い、ログレベル(INFO
、ERROR
など)を指定しています。
まとめ
この章では、Pythonにおける例外処理とデバッグの基礎について学びました。プログラムがエラーを適切に処理し、安定して動作するようにするために、例外処理を使うことは非常に重要です。次の章では、デリゲートとイベントについて詳しく見ていきます。