第8章: Pythonのエラー処理とデバッグ

プログラムを作成する上で避けられないのが「エラー」です。エラーは初心者だけでなく、ベテランのプログラマーでも経験するものであり、これを恐れず、上手に対処することが重要です。プログラムが予期せぬ動作をしたり、実行中に停止することはよくありますが、Pythonにはエラーを管理し、プログラムの安定性を保つための強力なツールが用意されています。この章では、Pythonでのエラー処理の方法を詳しく学び、エラーに対処しやすくするためのデバッグのコツやツールについても解説します。

8.1 エラーの種類

プログラム中で起こるエラーは、大きく分けて3種類あります。

  1. 構文エラー(Syntax Error)
    • コードの書き方に問題がある場合に発生します。プログラムは実行されず、Pythonインタプリタがエラーを出力します。例えば、括弧を閉じ忘れたり、コロンを忘れるなどが原因です。
    • 例:print("Hello World" # SyntaxError: unexpected EOF while parsing
  2. ランタイムエラー(Runtime Error)
    • プログラムの実行中に発生するエラーです。構文自体は正しいが、実行時に問題が発生する場合です。ゼロ除算や存在しないファイルへのアクセスが典型例です。
    • 例:x = 10 / 0 # ZeroDivisionError: division by zero
  3. 論理エラー(Logical Error)
    • 構文エラーやランタイムエラーがなく、プログラムが正常に実行されても、期待した結果が得られない場合に発生するエラーです。これはプログラムのロジックが間違っているために起こるもので、デバッグが最も難しいエラーです。

8.2 エラーを回避するためのtry-except文

エラーが発生した際に、プログラムがそのまま停止してしまうのを避けるために、Pythonでは try-except 文を使用します。この構文を使うことで、エラーが発生してもプログラムが途中で止まらず、適切な処理を続行できるようになります。

8.2.1 try-except文の基本構造

try-except 文は、以下のような基本的な構造を持っています:

try:
    # エラーが発生するかもしれないコード
except エラーの種類:
    # エラーが発生した場合に実行するコード

具体例を見てみましょう。次のコードは、ユーザーから入力された数値を使って割り算を行いますが、ユーザーが0を入力した場合にエラーが発生します。

try:
    number = int(input("割りたい数字を入力してください: "))
    result = 100 / number
    print(f"結果は {result} です")
except ZeroDivisionError:
    print("エラー: 0で割ることはできません。")

このコードでは、ZeroDivisionError が発生した場合にエラーメッセージを表示し、プログラムが停止するのを防いでいます。

8.2.2 複数の例外を処理する

try-except 文では、複数のエラーを処理することもできます。例えば、次のコードでは ValueErrorZeroDivisionError の両方をキャッチします。

try:
    number = int(input("割りたい数字を入力してください: "))
    result = 100 / number
    print(f"結果は {result} です")
except ValueError:
    print("エラー: 無効な数値が入力されました。")
except ZeroDivisionError:
    print("エラー: 0で割ることはできません。")

ここでは、数値以外が入力された場合の ValueError と、0で割った際の ZeroDivisionError の両方に対応しています。

8.2.3 エラーをキャッチせずにスルーする

特定のエラーを無視してプログラムを続行させたい場合、pass キーワードを使います。例えば、ファイルが存在しない場合でも処理を続けたい場合に使えます。

try:
    with open("somefile.txt", "r") as file:
        data = file.read()
except FileNotFoundError:
    pass

このように、エラーを処理せずプログラムを継続できますが、問題の原因がわからなくなる可能性もあるので注意が必要です。

8.2.4 finallyブロック

try-except 構文には、エラーの有無にかかわらず必ず実行される finally ブロックもあります。例えば、ファイルを開いたら必ず閉じるようにするコードは次のように書けます。

try:
    file = open("somefile.txt", "r")
    data = file.read()
except FileNotFoundError:
    print("ファイルが見つかりませんでした。")
finally:
    file.close()
    print("ファイルを閉じました。")

finally ブロックは、エラーが発生しても確実に実行されるため、リソースの開放などに役立ちます。

8.3 デバッグの基本ツールとコツ

エラー処理だけでなく、コードに潜むバグを見つけ、修正する作業(デバッグ)もプログラミングには欠かせません。Pythonには、デバッグを効率的に行うためのツールがいくつか存在します。

8.3.1 print文によるデバッグ

最も基本的なデバッグ方法は、print 文を使ってコードの途中で変数の値やプログラムの流れを確認することです。例えば、次のようにしてどの部分で問題が発生しているかを確認できます。

def divide(a, b):
    print(f"divide関数の引数: a = {a}, b = {b}")
    result = a / b
    print(f"結果: {result}")
    return result

divide(10, 2)
divide(10, 0)

この方法はシンプルですが、コードが複雑になると大量の print 文が散らばることになり、かえって見づらくなる場合があります。

8.3.2 Pythonデバッガ(pdb)の利用

Python標準ライブラリには、強力なデバッグツールである pdb モジュールが含まれています。pdb を使うことで、プログラムの実行をステップごとに確認したり、特定の変数の値をリアルタイムで調べたりすることが可能です。

pdb を使うには、デバッグしたい部分に pdb.set_trace() を追加します。

import pdb

def divide(a, b):
    pdb.set_trace()  # ここでプログラムが一時停止する
    result = a / b
    return result

divide(10, 2)

プログラムが pdb.set_trace() に到達すると、対話型のデバッグモードに入ります。ここでは、次のようなコマンドが使えます。

  • n: 次の行に進む
  • c: プログラムを続行
  • p 変数名: 特定の変数の値を表示

8.3.3 IDEのデバッグツール

多くの統合開発環境(IDE)には、デバッグ用のGUIツールが組み込まれています。例えば、VS CodeやPyCharmではブレークポイントを設定し、プログラムの実行を途中で停止させ、変数の値を調べたり、一行ずつコードを実行することが可能です。これらのツールは視覚的にわかりやすく、pdb よりも直感的に使えるため、多くのプログラマーにとって便利な選択肢です。

8.3.4 デバッグのコツ

  • 小さな変更を確認しながら進める: コードを少しずつ書き、常にテストを行うことで、どの部分にバグが発生したかを特定しやすくなります。
  • バグの再現性を確認する: エラーが発生した条件を再現し、同じ状況でエラーが再現されるかを確認します。再現性がある場合、その条件を特定しやすくなります。
  • 1つずつ試す: 問題が起こる場所がわからない場合、1つずつ変数やコードを確認し、徐々に原因を絞り込むことが重要です。

まとめ

この章では、Pythonのエラー処理とデバッグについて詳しく学びました。エラーは避けられないものですが、適切な処理とデバッグ技術を駆使することで、エラーの影響を最小限に抑え、より安定したプログラムを作成できます。


初心者におすすめ!プログラミングスクールのススメ

未経験でも気軽に!サブスク型プログラミングスクール【Freeks】

プログラミングを始めたいと思っているそこのあなた、独学よりもプログラミングスクールが断然おすすめです!理由は簡単、続けやすさです。

独学の挫折率、驚きの87.5%!

独学でプログラミングを続けるのは、実はかなりハードルが高いんです。データによると、なんと87.5%もの学習者が途中で挫折しているとか。一方、各プログラミングスクールが公表しているデータによると、受講生の約95%が最後までやり抜いているとのこと。数字を見れば一目瞭然、プログラミングスクールの方が圧倒的に続けやすいんです。

有料と無料、スクールの違いは?

プログラミングスクールには有料と無料のタイプがありますが、その違いは次の通りです:

  • 受講条件が異なる
  • 学べるスキルやカリキュラム内容が異なる
  • 就職や転職のサポート内容が異なる

どちらが自分に合っているか、よく考えて選ぶのが大事です。

サブスク型プログラミングスクール『FREEKS(フリークス)』に注目!

プログラミング初心者でも学びやすいと評判の『FREEKS』、その特徴は以下の通り:

  • 未経験者向けのわかりやすいカリキュラム
  • 経験豊富なエンジニアのサポート
  • オンラインで自分のペースで学習可能

なんと、月会費のみで全カリキュラムが受け放題!Java、PHP、HTML/CSS、JavaScriptなど、多彩なプログラミング言語が学べるんです。しかも、AIが質問に自動で答えてくれるシステムも導入済み。

終了後は副業もサポート!

カリキュラムを終了した後には、Freeks経由で未経験者でも取り組める副業案件の受注が可能。実務を通じてスキルを磨き、市場価値の高いエンジニアへの道が開けます。

独学で悩むくらいなら、まずはプログラミングスクールをチェックしてみるのもアリかもしれませんよ!
 ↓ ↓ こちらをクリック ↓ ↓ 

p-school

Share
Published by
p-school

Recent Posts

第6章: PHPのデータベース操作

PHPを使用してデータベースに…

2週間 ago

第5章: PHPのオブジェクト指向プログラミング(OOP)

オブジェクト指向プログラミング…

2週間 ago

第4章: PHPの関数

プログラミングにおいて、関数は…

2週間 ago

第3章: PHPの配列とコレクション

PHPでの配列とコレクションの…

2週間 ago

第2章: PHPの基本文法

PHPの基本的な構文や使い方を…

2週間 ago