レッスン1 / 2問目

『TracebackとTypeError』

このレッスンでは誤ったコードに対して出力されるエラーメッセージについて学習していきましょう。これまでの演習課題の中でも何度かエラーが発生したかと思いますが、初学者の方にとってはこのエラーメッセージがプログラミングにおいて最も大きな障壁となります。エラーメッセージは英語の長文で返ってくるため最初の内は混乱してしまう方も多いですが、どの部分が間違ったプログラムなのか教えてくれているだけですので、適切に読み解くことができればエラーも怖くなくなります。

TypeError

ではこのレッスンではエラーメッセージの一つであるTypeErrorを見ていきます。

エディタに「101匹の犬」と出力するコードがあります。まずはこのプログラムを実行してください。
すると以下のようなエラーメッセージが出力されます。


Traceback (most recent call last):
  File "main.py", line 4, in < module >
    print(num + "匹の犬")
TypeError: unsupported operand type(s) for +: 'int' and 'str'

長文でエラーメッセージが返ってきましたが、まずはプログラムのどの部分でエラーが発生しているのか少し考えてみてください。

コードを見ると4行目の「print(num + "匹の犬")」の部分で整数型と文字列型が演算されていることが原因だということはすぐにわかると思います。
今回はコードの量が少ないためプログラムを順番に目視で確認することでエラーを見つけることができましたが、コードの記述量が多くなるとそうはいきません。

そこで今回はエラーメッセージの意味を理解し「プログラムのどの部分でエラーが発生しているのか」また「どのようなエラーの内容なのか」を読み解くことができるように一行ずつ丁寧に説明していきます。

まずこのエラーメッセージを大まかに分類すると以下のようになります。

Tracebackのエラーメッセージ

Traceback (most recent call last):について

1行ずつ見ていきましょう。まずは青枠部分です。

Traceback (most recent call last):

「Traceback」とはプログラムの処理の履歴を順番に呼び出すことを指します。プログラムは基本的に上から順番に実行されます。そしてエラー(例外)が発生するとそこで処理がストップするのですが、そこまでの履歴を呼び出します。 その呼び出し履歴が上図の黄枠部分です。

次に「 (most recent call last)」ですが、この部分は呼び出し履歴の一番最後の部分でエラーが発生していることを表しています。今回であれば黄枠の一番下の「print(num + "匹の犬")」の部分でエラーが発生していることを表しています。


プログラムの呼び出し履歴

次は黄枠の呼び出し履歴です。

Tracebackのエラーメッセージ

上記黄枠部分について説明します。

  File "main.py", line 4, in < module >
    print(num + "匹の犬")

ここではエラーが発生するまでの処理を順番に呼び出しています。
まず一行目の「File "main.py", line 4, in < module >」の部分ですが、これはmain.pyというファイルの4行目の処理を呼び出していることを表しています。今現在みなさんは「ファイル」については特に意識をする必要はないですが、実際のプログラミングを行う際はエディタを使ってファイルにコードを書き込み、そのファイルを実行することでプログラムが実行されます。

次に「print(num + "匹の犬")」の部分ですが、これは実行されたプログラムです。先ほども説明したようにこの部分でエラーが発生しています。

エラーの種類と内容

次は赤枠部分です。

Tracebackのエラーメッセージ

上記赤枠部分について説明します。


TypeError: unsupported operand type(s) for +: 'int' and 'str'

ここが最も重要なメッセージであり、エラーの原因が記述されています。

エラーメッセージを和訳すると「整数型と文字列型の演算を「+」演算子がサポートしていない」という意味になります。つまり整数型と文字列型を演算してしまっていることが原因であることがわかります。

TypeErrorはこのように型が違うオブジェクト同士を演算した際などに発生するエラーです。

補足ですが、エラーメッセージの中のoperandとは「式の中の演算子ではない構成要素」のことです。つまり変数や文字列を表しており、ここでは「print(num + "匹の犬")」の中の「num」「"匹の犬"」を指します。

まとめ

実際のエラーメッセージは今回よりさらに長文であることが多く混乱してしまうこともありますが、最も重要なメッセージは一番下のエラー内容が記述してある部分(上図の赤枠部分)です。ほとんどの場合はここを読み解くことによりエラーを解決することができます。

ではこのレッスンは以上となります。コードを修正して判定ボタンを押し次のレッスンへ進んでください。

Last updated:2020/2/2

101匹の犬
numは数値型のため文字列と連結することはできません。
数値を文字列に変換するには str関数を使用します。
  1. num = 101

  2. print(str(num) + "匹の犬")
main.py
設定
g
n
i
d
a
o
L