カナデKanade

10. エラーを受け止める(とりあえずやってみよう)

エラーが出てもプログラムが止まらないように受け止めましょう。

この章で学ぶこと

  • エラーが出るとプログラムがどうなるか
  • エラーを受け止める(とりあえずやってみよう:、発生したら:)
  • 自分でエラーを出す(発生させよう)
  • 何があっても実行する(最後はいつも:)

エラーが出るとプログラムは止まります

ここまでに見たエラーは、どれもその場でプログラムを止めました。 下のコードは、〈数字に〉が「十」を数字に変えられずに止まります。最後の行は実行されません。

『数』を〈数字に〉(「十」)にしよう
「この行は実行されません。」を出力しよう

ユーザーが数字の代わりに文字を入力するように、起こりうると分かっているエラーでプログラム全体が止まるのは困りますよね。そんなときは、エラーを受け止める安全網を張っておけます。


安全網: とりあえずやってみよう / 発生したら

とりあえずやってみよう:
    『数』を〈数字に〉(「十」)にしよう
    「変換に成功!」を出力しよう
発生したら(『エラー』):
    「数字に変えられない値です。」を出力しよう
「プログラムは続きます。」を出力しよう
  1. とりあえずやってみよう:の下のまとまりを実行します。
  2. その中でエラーが出ると、すぐに止まって発生したら:の下のまとまりへ移ります。(「変換に成功!」は実行されません。)
  3. エラーがなければ、発生したら:のまとまりは飛ばします。
  4. どちらにしても、その次の行からプログラムは続けて実行されます。

かっこの中の『エラー』には、起きたエラーが入ります。『エラー』の『メッセージ』で、何のエラーなのかを見られます。必要なければ、かっこなしで発生したら:だけを書いてもかまいません。

とりあえずやってみよう:
    (10 / 0)を出力しよう
発生したら(『エラー』):
    (『エラー』の『メッセージ』)を出力しよう

DivideByZeroError: 0で割ることはできません。が出ます。カナデが出したエラーのメッセージには、前にエラーの種類が付きます。種類ごとの意味は付録. よく出会うエラーにあります。


実践: 入力を安全に受け取る

2章で、【数字】で入力してもらおうに文字を入れるとエラーで止まりましたね。安全網で囲めば、もう一度尋ねられます。

『年齢』を空っぽにしよう

(『年齢』が空っぽと同じだ)間繰り返そう:
    「年齢を数字で入力してください: 」を続けて出力しよう
    とりあえずやってみよう:
        『年齢』を【数字】で入力してもらおう
    発生したら:
        「数字だけ入力できます。もう一度どうぞ。」を出力しよう

枠「{『年齢』}歳なんですね!」を出力しよう

数字ではない値を入れると案内を見せて、もう一度尋ねます。数字を入れると繰り返しが終わります。


自分でエラーを出す: 発生させよう

自分で決めたルールが破られたときに、わざとエラーを出すこともできます。新しい【エラー】(「説明」)を発生させようと書くと、その場でエラーが出ます。

〈引き出す〉を作ろう(『残高』, 『金額』):
    もし(『金額』が『残高』より大きい)なら:
        新しい【エラー】(「残高が足りません。」)を発生させよう
    (『残高』 - 『金額』)を返そう

とりあえずやってみよう:
    (〈引き出す〉(1000, 300))を出力しよう
    (〈引き出す〉(1000, 5000))を出力しよう
発生したら(『エラー』):
    枠「引き出し失敗: {『エラー』の『メッセージ』}」を出力しよう

700と引き出し失敗: 残高が足りません。が出ます。関数の中で出したエラーも、関数を呼んだ場所のとりあえずやってみようが受け止めます。関数は「これはできません」と知らせるだけで、どう対処するかは呼ぶ側が決めるんです。


何があっても: 最後はいつも

エラーが出ても出なくても必ず実行したいことは、最後はいつも:の下に書きます。後片付けをしたり、「終わりました」と知らせたりするときに使います。

とりあえずやってみよう:
    「作業を始めます。」を出力しよう
    (10 / 0)を出力しよう
発生したら:
    「エラーが出ました。」を出力しよう
最後はいつも:
    「作業を終えました。」を出力しよう

(10 / 0)の行を消して、もう一度実行してみてください。エラーがなくても作業を終えました。は出ます。


いつ安全網を使う?

  • 使うといいとき: ユーザーの入力、ファイル、ネットワークのように、自分では防げない問題が起こりうるとき
  • 先にもしで確かめられるとき: リストにその番目があるか、辞書にそのキーがあるか、割る数が0かのように前もって調べられるなら、もしのほうがはっきりします。
『果物』を【「りんご」, 「なし」】にしよう
『番目』を3にしよう

もし(『番目』が『果物』の『長さ』以下だ)なら:
    (『果物』の『番目』番目)を出力しよう
それ以外なら:
    「その番目はありません。」を出力しよう

すべてのコードを安全網で囲むと、本当の間違いまで静かに埋もれてしまいます。必要な所にだけ使ってください。


自分だけのエラーの種類(オブジェクト指向を学んだあとで)

エラーの種類によって違う対処をしたいときは、【エラー】を受け継いだ自分だけのエラーを作り、【種類】が発生したらで選んで受け止められます。クラスと継承を使うので、オブジェクト指向を学んでから見てください。

【決済エラー】を【エラー】を基づいて設計しよう:
    最初に作られる時(『初期メッセージ』)次のようにしよう:
        親の〈最初に作られる時〉(『初期メッセージ』)を実行しよう

【在庫エラー】を【エラー】を基づいて設計しよう:
    最初に作られる時(『初期メッセージ』)次のようにしよう:
        親の〈最初に作られる時〉(『初期メッセージ』)を実行しよう

とりあえずやってみよう:
    新しい【在庫エラー】(「売り切れました!」)を発生させよう
【決済エラー】が発生したら(『エラー』):
    「決済をもう一度確認してください。」を出力しよう
【在庫エラー】が発生したら(『エラー』):
    枠「在庫の問題: {『エラー』の『メッセージ』}」を出力しよう
発生したら(『エラー』):
    (参考) 上で受け止めなかった残りのエラーは、全部ここで受け止めます。
    (『エラー』の『メッセージ』)を出力しよう

種類で選んで受け止められるのは、このように自分で作ったエラーの種類を投げたときだけです。10 / 0のようにカナデが自分で出すエラーは、いちばん下の発生したらでしか受け止められません。


よくある間違い

1. 安全網の外でエラーが出る

とりあえずやってみよう:のまとまりの中で出たエラーだけを受け止めます。エラーが出るかもしれない行が、まとまりの中に字下げされているか確かめてください。

2. エラーが出たあとの行も実行されると思う

まとまりの中でエラーが出ると、その下の行は飛ばして発生したらへ移ります。

3. 何でも安全網で囲む

間違いまで隠れて、見つけにくくなります。予想できるエラーにだけ使ってください。


まとめ

やりたいこと 書き方
エラーを受け止める とりあえずやってみよう: … 発生したら(『エラー』):
何のエラーか 『エラー』の『メッセージ』
自分でエラーを出す 新しい【エラー】(「説明」)を発生させよう
いつも実行する 最後はいつも:

練習問題

1. 文字「12a」を数字に変えようとして、失敗したら「数字ではありません」と出力してみましょう。

答えの例
とりあえずやってみよう:
    『数』を〈数字に〉(「12a」)にしよう
    『数』を出力しよう
発生したら:
    「数字ではありません」を出力しよう

2. 年齢を受け取って、0より小さければ「年齢は0より小さくできません。」というエラーを出す〈年齢チェック〉を作り、-5を入れてそのエラーを受け止めて出力してみましょう。

答えの例
〈年齢チェック〉を作ろう(『年齢』):
    もし(『年齢』が0より小さい)なら:
        新しい【エラー】(「年齢は0より小さくできません。」)を発生させよう
    「正しい年齢です。」を返そう

とりあえずやってみよう:
    (〈年齢チェック〉(-5))を出力しよう
発生したら(『エラー』):
    (『エラー』の『メッセージ』)を出力しよう

3. 下のコードで、何がどんな順番で出力されるか予想してみましょう。

とりあえずやってみよう:
    「あ」を出力しよう
    新しい【エラー】(「問題」)を発生させよう
    「い」を出力しよう
発生したら:
    「う」を出力しよう
最後はいつも:
    「え」を出力しよう
「お」を出力しよう
答えを見る

あ、う、え、おです。エラーが出たあとのいは飛ばされます。

次の章では、カナデに最初から入っているいろいろな道具(標準ライブラリ)を取り出して使う方法を学びます。

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