0
0

【Python3エンジニア認定基礎試験】8. エラーと例外

Last updated at Posted at 2024-08-31

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クラスを使うと、複数の例外を一度に送出し、それらを処理できます。
これは、並行処理や複数のエラーが同時に発生する可能性がある場面で役立ちます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0