10. エラーを受け止める(とりあえずやってみよう)
エラーが出てもプログラムが止まらないように受け止めましょう。
この章で学ぶこと
- エラーが出るとプログラムがどうなるか
- エラーを受け止める(
とりあえずやってみよう:、発生したら:)- 自分でエラーを出す(
発生させよう)- 何があっても実行する(
最後はいつも:)
エラーが出るとプログラムは止まります
ここまでに見たエラーは、どれもその場でプログラムを止めました。 下のコードは、〈数字に〉が「十」を数字に変えられずに止まります。最後の行は実行されません。
『数』を〈数字に〉(「十」)にしよう
「この行は実行されません。」を出力しよう
ユーザーが数字の代わりに文字を入力するように、起こりうると分かっているエラーでプログラム全体が止まるのは困りますよね。そんなときは、エラーを受け止める安全網を張っておけます。
安全網: とりあえずやってみよう / 発生したら
とりあえずやってみよう:
『数』を〈数字に〉(「十」)にしよう
「変換に成功!」を出力しよう
発生したら(『エラー』):
「数字に変えられない値です。」を出力しよう
「プログラムは続きます。」を出力しよう
とりあえずやってみよう:の下のまとまりを実行します。- その中でエラーが出ると、すぐに止まって
発生したら:の下のまとまりへ移ります。(「変換に成功!」は実行されません。) - エラーがなければ、
発生したら:のまとまりは飛ばします。 - どちらにしても、その次の行からプログラムは続けて実行されます。
かっこの中の『エラー』には、起きたエラーが入ります。『エラー』の『メッセージ』で、何のエラーなのかを見られます。必要なければ、かっこなしで発生したら:だけを書いてもかまいません。
とりあえずやってみよう:
(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. 下のコードで、何がどんな順番で出力されるか予想してみましょう。
とりあえずやってみよう:
「あ」を出力しよう
新しい【エラー】(「問題」)を発生させよう
「い」を出力しよう
発生したら:
「う」を出力しよう
最後はいつも:
「え」を出力しよう
「お」を出力しよう
答えを見る
あ、う、え、おです。エラーが出たあとのいは飛ばされます。
次の章では、カナデに最初から入っているいろいろな道具(標準ライブラリ)を取り出して使う方法を学びます。