8.エラーと例外
Pythonプログラミングでは、コードを実行する際に発生するエラーには大きく分けて2つの種類があります。それは 構文エラー と 例外 です。
8.1. 構文エラー
構文エラーは、コードがPythonの文法に従っていない場合に発生します。構文エラーが発生すると、Pythonはエラーメッセージを表示してコードのどこでエラーが発生したかを示します。
while True print('Hello world')
このコードは構文エラーを引き起こします。Pythonは、while文の後に:が必要であることを示しています。
8.2. 例外
一方、例外は、コードの構文が正しくても、実行時に何らかの問題が発生した場合に生じます。例外は通常、特定のエラーメッセージとともに表示され、プログラムの実行が中断されます。
10 * (1/0)
これはZeroDivisionErrorという例外を引き起こします。他にも、未定義の変数を使用した場合はNameErrorが、異なるデータ型を不適切に結合しようとするとTypeErrorが発生します。
8.3. 例外を処理する
Pythonでは、try...exceptブロックを使用して例外を処理できます。これにより、プログラムが予期しないエラーで停止するのを防ぎ、適切にエラーを処理することができます。
while True:
try:
x = int(input("Please enter a number: "))
break
except ValueError:
print("Oops! That was no valid number. Try again...")
この例では、ユーザーが無効な入力をした場合に例外をキャッチし、再度入力を促します。
8.4. 例外を送出する
プログラムの中で明示的に例外を発生させたい場合、raise文を使います。
raise NameError('HiThere')
これはNameErrorを強制的に発生させます。
8.5. 例外の連鎖
例外が別の例外によって引き起こされる場合、その連鎖を明示的に示すためにfrom句を使用できます。
try:
func()
except ConnectionError as exc:
raise RuntimeError('Failed to open database') from exc
この例では、RuntimeErrorがConnectionErrorによって引き起こされたことが示されます。
8.6. ユーザー定義例外
Pythonでは、独自の例外クラスを定義することもできます。これは、特定のエラー条件を表現するために便利です。通常、これらのクラスはExceptionクラスを継承して作成されます。
8.7. クリーンアップ動作を定義する
try...finallyブロックを使用すると、例外の発生にかかわらず、常に実行されるクリーンアップコードを定義できます。例えば、ファイルを開いた後に必ず閉じる操作などです。
try:
raise KeyboardInterrupt
finally:
print('Goodbye, world!')
このコードでは、KeyboardInterrupt例外が発生した後でもfinallyブロックが実行されます。
8.8. 定義済みクリーンアップ処理
with文を使用すると、リソースのクリーンアップが自動的に行われます。これは、ファイルの処理などで特に便利です。
with open("myfile.txt") as f:
for line in f:
print(line, end="")
このコードでは、ファイルが自動的に閉じられます。
8.9. 複数の関連しない例外の送出と処理
PythonのExceptionGroupクラスを使うと、複数の例外を一度に送出し、それらを処理できます。
これは、並行処理や複数のエラーが同時に発生する可能性がある場面で役立ちます。