Python におけるエラーと例外

PythonBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、Python におけるエラーと例外処理について実践的な理解を深めます。コードの実行を妨げる一般的な構文エラーの特定方法、実行時(runtime)に発生する様々な種類の例外の認識方法、そして Python プログラミングにおけるこれら二つの基本的な概念を明確に区別する方法を探ります。

実践的な演習を通じて、不適切なインデントや欠落した構文要素など、よくある落とし穴を見つけて修正する方法を学び、堅牢でエラーのない Python コードを書くための強固な基盤を築きます。

これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 初級 レベルの実験の完了率は 100%です。学習者から 100% の好評価を得ています。

構文エラーの特定

このステップでは、Python における一般的な構文エラーについて探ります。構文エラーは、コードが言語の文法規則に違反している場合に発生し、インタープリタがコードを理解し実行することを妨げます。これらのエラーは、プログラムが実行を開始する前に検出されます。

必要なファイル syntax_errors.py は、~/project ディレクトリ内に用意されています。

まず、IndentationError(インデントエラー)について見てみましょう。WebIDE の左側にあるファイルエクスプローラーから syntax_errors.py を開いてください。不適切なインデントを含む以下のコードを追加します。

for i in range(5):
    print(i)
  print("This line has incorrect indentation")

ファイルを保存します。次に、統合ターミナルを開き、スクリプトを実行します。

python syntax_errors.py

IndentationError が表示されるはずです。Python インタープリタは、コードブロック(for ループ内のものなど)が一貫したインデントレベルを持つことを期待しています。

  File "/home/labex/project/syntax_errors.py", line 3
    print("This line has incorrect indentation")
                                                ^
IndentationError: unindent does not match any outer indentation level

次に、インデントを修正しますが、別の SyntaxError(構文エラー)を導入します。syntax_errors.py のコードを以下のように変更します。最初の行の末尾にあるコロン(:)が欠落していることに注意してください。

for i in range(5)
    print(i)
    print("This line has correct indentation")

ファイルを保存し、ターミナルから再度実行します。

python syntax_errors.py

今度は SyntaxError が発生します。Python の for ループ文は、コードブロックの開始を示すために末尾にコロンが必要です。

  File "/home/labex/project/syntax_errors.py", line 1
    for i in range(5)
                     ^
SyntaxError: expected ':'

最後に、コロンを修正しますが、別の一般的な SyntaxError、つまり未終了の文字列(unterminated string)を導入します。syntax_errors.py ファイルを次のように変更します。文字列 "hello' はダブルクォートで始まっていますが、シングルクォートで終わっています。

for i in range(5):
    print("hello')

ファイルを保存して実行します。

python syntax_errors.py

文字列が対応する引用符で適切に閉じられていないため、SyntaxError に遭遇します。

  File "/home/labex/project/syntax_errors.py", line 2
    print("hello')
          ^
SyntaxError: unterminated string literal (detected at line 2)

これらの例は、構文エラーはプログラムが実行される前に修正されなければならないことを示しています。インデント、コロンのような必須の記号、および対応する引用符には常に細心の注意を払ってください。

一般的な例外を認識する

このステップでは、一般的な例外について探ります。例外は、構文エラーとは異なり、プログラムの実行中に発生します。コードは構文的には正しいものの、実行中にエラーが発生します。

ファイル common_exceptions.py~/project ディレクトリ内に用意されています。

まず、ZeroDivisionError(ゼロ除算エラー)を発生させてみましょう。エディタで common_exceptions.py を開き、以下のコードを追加します。

numerator = 10
denominator = 0
result = numerator / denominator
print(result)

ファイルを保存し、ターミナルから実行します。

python common_exceptions.py

プログラムは実行を開始しますが、停止し、ZeroDivisionError を表示します。数学的にゼロによる除算は未定義であり、Python はこの例外を発生させて問題を指摘します。

Traceback (most recent call last):
  File "/home/labex/project/common_exceptions.py", line 3, in <module>
    result = numerator / denominator
ZeroDivisionError: division by zero

次に、NameError(名前エラー)を発生させてみましょう。これは、まだ定義されていない変数を使おうとしたときに発生します。common_exceptions.py の内容を以下に置き換えてください。

print(undefined_variable)

ファイルを保存して実行します。

python common_exceptions.py

インタープリタが undefined_variable が何を指しているのかわからないため、NameError が発生します。

Traceback (most recent call last):
  File "/home/labex/project/common_exceptions.py", line 1, in <module>
    print(undefined_variable)
NameError: name 'undefined_variable' is not defined

次に、TypeError(型エラー)を見てみましょう。これは、不適切な型のオブジェクトに対して操作を実行しようとしたときに発生します。common_exceptions.py の内容をこのコードに置き換えてください。

print("Hello" + 5)

スクリプトを保存して実行します。

python common_exceptions.py

TypeError が表示されます。Python では、文字列と整数を直接加算(+)することは許可されていません。

Traceback (most recent call last):
  File "/home/labex/project/common_exceptions.py", line 1, in <module>
    print("Hello" + 5)
TypeError: can only concatenate str (not "int") to str

最後に、IndexError(インデックスエラー)を実演します。これは、シーケンス(リストなど)の要素に、範囲外のインデックスを使ってアクセスしようとしたときに発生します。common_exceptions.py の内容を以下に置き換えてください。

my_list = [1, 2, 3]
print(my_list[5])

スクリプトを保存して実行します。

python common_exceptions.py

IndexError が発生します。リスト my_list には 3 つの要素しかないので、有効なインデックスは 0、1、2 です。インデックス 5 へのアクセスは不可能です。

Traceback (most recent call last):
  File "/home/labex/project/common_exceptions.py", line 2, in <module>
    print(my_list[5])
IndexError: list index out of range

これらの一般的な例外を理解することは、Python コードのデバッグを学ぶ上で重要な部分です。

エラーと例外を区別する

この最終ステップでは、構文エラーと例外を明確に区別します。この区別は、Python プログラミングとデバッグの基本です。

構文エラー(またはパースエラー):

  • これらは、Python の規則に違反するコードの構造上の誤りです。
  • Python インタープリタは、プログラムの実行が開始されるにこれらのエラーを見つけます。
  • 構文エラーのあるプログラムは、まったく実行できません。
  • 例:IndentationError、コロンの欠落、括弧や引用符の不一致。

例外(または実行時エラー):

  • これらのエラーは、構文的に正しいプログラムの実行中に発生します。
  • ゼロ除算や存在しないファイルへのアクセスなど、プログラムが予期しない状況に遭遇したときに発生します。
  • 処理されない場合、例外はプログラムをクラッシュさせ、トレースバック(traceback)を出力します。
  • 例:ZeroDivisionErrorNameErrorTypeErrorIndexError

これを実際に見てみましょう。ファイルエクスプローラーからファイル error_vs_exception.py を開きます。構文エラー(コロンの欠落)と、実行時例外を引き起こす行の両方を含む以下のコードを追加します。

## This line has a syntax error (missing colon)
for i in range(5)
    print(i)

## This line will cause an exception (division by zero)
result = 10 / 0
print(result)

ファイルを保存し、実行してみます。

python error_vs_exception.py

すぐに SyntaxError が発生することに注目してください。インタープリタは、コードの実行前にファイル全体を構文的にチェックします。コロンの欠落を見つけ、そこで停止し、10 / 0 の行に到達することさえありません。

  File "/home/labex/project/error_vs_exception.py", line 2
    for i in range(5)
                     ^
SyntaxError: expected ':'

次に、構文エラーを修正しましょう。error_vs_exception.pyfor ループの行に欠落しているコロンを追加します。

## The syntax error is now fixed
for i in range(5):
    print(i)

## This line will cause an exception (division by zero)
result = 10 / 0
print(result)

ファイルを保存し、再度実行します。

python error_vs_exception.py

今度はプログラムは構文的に正しいため、実行が開始されます。for ループが実行され、0 から 4 までの数字が出力されます。その後、プログラムが result = 10 / 0 を実行しようとすると、実行時問題に遭遇し、ZeroDivisionError を発生させ、プログラムをクラッシュさせます。

0
1
2
3
4
Traceback (most recent call last):
  File "/home/labex/project/error_vs_exception.py", line 6, in <module>
    result = 10 / 0
ZeroDivisionError: division by zero

これは、構文エラーは実行を妨げ、例外は実行中に発生するということを明確に示しています。今後の実験(Lab)では、例外がプログラムをクラッシュさせないように、例外を適切に処理する方法を学びます。

まとめ

この実験(Lab)では、Python におけるエラーと例外の根本的な違いを学びました。まず、インデントエラー(IndentationError)やコロンの欠落による構文エラー(SyntaxError)など、プログラムの実行を完全に妨げる一般的な構文エラーを特定し、修正しました。

次に、ZeroDivisionErrorNameErrorTypeErrorIndexError を含むいくつかの一般的な実行時例外を探りました。これらが、構文的に正しいコードであっても、実行中に操作が失敗したときにどのように発生するかを確認しました。最後に、構文エラーと潜在的な例外の両方を含むファイルを Python インタープリタがどのように処理するかを観察することで理解を深め、構文チェックが実行開始前に行われることを証明しました。この知識は、Python アプリケーションの記述とデバッグのための重要な基盤となります。