カナデKanade

付録. よく出会うエラー

カナデが教えてくれるエラーメッセージの意味と、直し方をまとめました。

エラーは「間違っている」という烙印ではなく、どこがなぜうまくいかないかを教えてくれる案内です。カナデは黙って通り過ぎる代わりに、理由を伝えます。エラーが起きると、次のように表示されます。

ランタイムエラー: 種類: 説明

前の種類(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章にあります。

プレイグラウンド
結果
コードを書いて「実行」ボタンを押してください。