トレースバックを使用してエラーを検出する

完了

Python の例外は、この言語の中核となる機能です。 エラーを生成する原因となるものが、機能として取り上げられていることに驚くかもしれません。 そう思われるのは、堅牢なソフトウェア ツールが、トレースバック (エラーがどのように開始して終了したかを示す数行のテキスト) を出してクラッシュすることはあまりないためでしょう。

しかしながら、例外は、説明的なエラー メッセージを生成することによって意思決定を行うのに役立ちます。 これらは、予想される問題と予期しない問題のいずれの処理でも役に立ちます。

トレースバック

"トレースバック" とは、処理されなかったエラーの発生元 (および終了) をポイントできる一連のテキストです。 トレースバックのコンポーネントを理解することで、エラーの修正や、正常に動作していないプログラムのデバッグをより効果的に行えます。

Python で初めて例外が発生したときに、それを抑制することによってエラーを回避しようと考える場合があります。 プログラムで処理されないエラーが発生すると、トレースバックが出力として表示されます。 このモジュールに示されているように、トレースバックは便利です。 エラーを適切に処理してこれらが表示されないようにしたり、役に立つ情報のみを表示したりする方法があります。

Python の対話型セッションを開き、存在しないファイルを開いてみます。

open("/path/to/mars.jpg")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/mars.jpg'

この出力にはいくつかの重要な部分があります。 最初に、トレースバックは出力の順序を示しています。 次に、ファイルは、入力の最初の行にある stdin (対話型ターミナルの入力) であることを通知しています。 エラーは FileNotFoundError (例外の名前) です。これは、ファイルが存在しないか、またそのファイルへのディレクトリが存在しない可能性があることを意味します。

これは大量の情報です。 1 行目が意味を持つ理由や、Errno 2 の意味を理解するのは難しい場合があります。

目的のディレクトリを Visual Studio Code で開き、open.py という名前の Python ファイルを作成します。

Screenshot showing the creation of a new Python file in Visual Studio Code.

次のコンテンツをファイルに追加して保存します。

def main():
    open("/path/to/mars.jpg")

if __name__ == '__main__':
    main()

これは、前と同様に、存在しないファイルを開く単一の main() 関数です。 最後に、この関数は、ターミナルで呼び出されたときに関数 main() を実行するようインタープリターに指示する Python ヘルパーを使用しています。 Python を使用して Bash ターミナルでコマンドを実行し、エラー メッセージをチェックします。

python3 open.py
Traceback (most recent call last):
  File "/tmp/open.py", line 5, in <module>
    main()
  File "/tmp/open.py", line 2, in main
    open("/path/to/mars.jpg")
FileNotFoundError: [Errno 2] No such file or directory: '/path/to/mars.jpg'

エラー出力がよりわかりやすくなりました。 パスは、open.py という名前の 1 つのファイルを指しています。 出力には、main() への呼び出しを含む 5 行目でエラーが始まったことが示されています。 次に、出力は open() 関数呼び出しの 2 行目のエラーへと続きます。 最後に、ここでも FileNotFoundError がファイルまたはディレクトリが存在しないことを報告しています。

トレースバックには、ほとんどの場合、次の情報が含まれています。

  • すべての関数のすべての呼び出しに関連するすべてのファイル パス。
  • すべてのファイル パスに関連付けられている行番号。
  • 例外の生成に関係する関数、メソッド、またはクラスの名前。
  • 発生した例外の名前。