付録. よく出会うエラー
カナデが教えてくれるエラーメッセージの意味と、直し方をまとめました。
エラーは「間違っている」という烙印ではなく、どこがなぜうまくいかないかを教えてくれる案内です。カナデは黙って通り過ぎる代わりに、理由を伝えます。エラーが起きると、次のように表示されます。
ランタイムエラー: 種類: 説明
前の種類(TypeError、ReferenceError …)がエラーの名前で、後ろが何が起きたかを書いた文です。以下では、エラーを1つずつわざと起こしながら、原因と直し方を見ていきます。(エラーをとりあえずやってみようで捕まえる方法は10章にあります。)
変数が見つからないとき
作っていない変数を使ったか、名前を間違えています。
枠「{『なし』}」を出力しよう
ReferenceError: 変数『なし』が見つかりません。
直すには: 名前が合っているか確認して、使う前ににしようで先に作っておきましょう。繰り返しやエラー処理の中で最初に作った変数は、その外では使えません。
ない関数を呼んだとき
ない関数を呼びました。名前の打ち間違いか、関数を作る前に呼んだのかもしれません。
〈ない関数〉()を実行しよう
MethodNotFoundError: 関数『ない関数』が見つかりません。
直すには: 関数の名前を確認して、ほかのファイルやモジュールの関数なら持ってこようで先に持ってきましょう。
タイプの違う値を入れたとき
【数字】にした変数に文字列を入れるように、決めておいたタイプと違う値を入れようとしました。
『年齢』を【数字】の「二十」にしよう
TypeError: 『年齢』には『数字』型の値しか入れられません。『文字列』の値が渡されました。
直すには: 値のタイプを合わせるか、変数を作るときにタイプを決め直しましょう。タイプを決めていない変数は、何でも入れられます。
数字と文字列を足したとき
数字と文字列のように、違うタイプをそのまま足そうとしました。カナデは勝手に変えて計算しません。
(10 + 「こんにちは」)を出力しよう
TypeError: 『+』演算は『数字』と『文字列』の間ではできません。自動変換はしません。
直すには: 〈数字に〉()や〈文字列に〉()でタイプを自分で変えましょう。
0で割ったとき
ある数を0で割りました。
(10 / 0)を出力しよう
DivideByZeroError: 0で割ることはできません。
直すには: 割る前に、割る数が0でないかをもしで確認しましょう。
リストの範囲を超えたとき
リストの長さより大きい番目を求めました。番目は1から数えます。
『果物』を【(文字列)リスト】の【「りんご」】にしよう
『果物』の5番目の値を出力しよう
IndexOutOfBoundsError: リストの長さを超えた位置(インデックス)です。
直すには: 『リスト』の『長さ』で長さを確認して、その中の番目だけを使いましょう。空のリストから取り出すときにも同じエラーになります。
辞書にない名前を探したとき
辞書にない名前(キー)を探しました。
『情報』を【(文字列,文字列)辞書】の{「名前」:「花」}にしよう
『情報』の「職業」を出力しよう
KeyError: 辞書から ‘職業’ という名前を見つけることができません。
直すには: 名前が合っているか確認しましょう。辞書に名前を先に入れておかないと取り出せません。
固定した値を変えたとき
固定しようで作った値を変えようとしました。
『定数』を【数字】の3に固定しよう
『定数』を5にしよう
ConstantAssignmentError: 定数 ‘定数’ の値は変更できません。
直すには: 変わる必要のある値なら、にしようで作りましょう。
引数が足りないとき
関数が必要とする引数を渡していません。
〈二倍〉を作ろう(【数字】の『数』):
(『数』 * 2)を返そう
〈二倍〉()を出力しよう
MissingArgumentError: 引数『数』が必要です。
直すには: 関数を作るときに決めた引数をすべて渡しましょう。引数にデフォルト値(= 値)を決めておけば、省略してもかまいません。
引数が多すぎるとき
関数が受け取るより多くの引数を渡しました。
〈二倍〉を作ろう(【数字】の『数』):
(『数』 * 2)を返そう
〈二倍〉(1, 2)を出力しよう
ArgumentError: 引数が多すぎます。1個が必要ですが、2個渡されました。
直すには: 関数の引数の数に合わせて渡しましょう。
返した値のタイプが違うとき
【数字】を返すのように返すタイプを書いたのに、別のタイプの値を返しました。
【数字】を返す〈年齢〉を作ろう():
「二十」を返そう
〈年齢〉()を出力しよう
TypeError: 関数『年齢』は『数字』型を返す必要がありますが、『文字列』の値を返しました。
直すには: 返す値を直すか、返すタイプを直すか消しましょう。
隠したプロパティを外から呼んだとき
隠そうで作ったプロパティや関数を、クラスの外から呼びました。
【ノート】を設計しよう:
『日記』を【文字列】の「秘密」に隠そう
『ノート』を【ノート】の新しい【ノート】()にしよう
『ノート』の『日記』を出力しよう
AccessViolationError: ‘日記’ 属性は内部専用(private)なので外部から呼ぶことはできません。
直すには: クラスの中の関数を通して扱うか、外で使う必要があるなら隠さないでください。
数字に変えられないとき
数字に変えられない文字列を〈数字に〉()に渡しました。
〈数字に〉(「あいう」)を出力しよう
ConversionError: 『あいう』を数字に変換できません。
直すには: 文字列が数字の形(「12」、「3.5」)か確認しましょう。ユーザーから入力された値なら、とりあえずやってみようで囲むのもよい方法です。
空っぽのプロパティを探したとき
空っぽの値のプロパティや関数を探しました。
『値』を空っぽにしよう
『値』の『名前』を出力しよう
MemberAccessError: 『null』型の値にはメンバーとしてアクセスできません。
直すには: 値が空っぽでないかを、先に確認しましょう。準備しようだけで作った変数は、値を入れるまで空っぽです。
文字を書き換えようとしたとき
文字列の何番目かの文字を変えようとしました。文字列は、作ったあとで変えることができません。
『名前』を【文字列】の「花」にしよう
『名前』の1番目を「金」にしよう
ImmutableAssignmentError: 文字列は変更できない値なので、何番目かの文字を代入し直せません。
直すには: 新しい文字列をにしようで作り直して入れましょう。
条件が真・偽でないとき
もしや間繰り返そうの条件に、数字や文字列をそのまま書きました。真か偽だけが書けます。
『年齢』を【数字】の20にしよう
もし(『年齢』)なら:
「大人」を出力しよう
TypeError: 数字の値は条件に使えません。条件には真か偽が必要です。
直すには: (『年齢』 >= 20)のように、比較ではっきり書きましょう。
呼び出しが深すぎるとき
関数が自分自身を延々と呼んで、呼び出しが10000階層を超えました。
〈無限〉を作ろう(『n』):
〈無限〉(『n』 + 1)を実行しよう
〈無限〉(1)を実行しよう
RecursionError: 呼び出しが深く重なりすぎて、10000階層を超えました。
直すには: 再帰する関数には、いつ止まるか(もしで終わる場合)を必ず入れましょう。
ないモジュールを持ってきたとき
ないモジュールを持ってこようとしました。
【ないモジュール】から〈道具〉を持ってこよう
ImportError: パッケージ『[ないモジュール]』が見つかりません。
直すには: モジュールの名前と道具の名前を確認しましょう。標準ライブラリは11章にあります。