Coding for KidsCoding for Kids
クリエイティブレベル挑戦教師ガイド
機能に投票
上級Python開発コース
チャプター
>
レベル

例外処理
複数の例外

目的

複数の例外処理を使用して、医療用資材をクレートに正しく収集し保管せよ。

屋根裏の倉庫には補充が必要です。いくつかの資材は使用されたまま補充されていません。物置の一つにあるメモに、追加の資材の注文が記されていますので、それを処理するのは良い考えです。つまり、いろいろな種類の資材をまとめ、クレートに保管する作業です。

クレートを満たすために必要な資材のデータ型や数が異なるため、様々なエラーが発生する可能性があります。try / except を使って可能性のあるエラーをキャッチし、いくつかの問題を修正できますが、1つの操作で複数のエラーが発生する場合はどうすれば良いでしょうか? これに対処するため、キャッチしようとしている具体的な例外を指定し、複数の例外処理を使用することができます。

まずは、金色の X マークのところまで歩き、ドアの方を向いて、open() 関数を使って物置に入ります。中に入ったら、暗い X マークのところまで歩き、右を向いて read() 関数を使用し、テーブルの上にあるメモで材料とその注文量を確認します。リスト定数に関する情報として、必要な資材とその注文数がメモに書かれています。確認が終わったら、物置内の明るい X マークのところまで歩き、クレートの方に向かい、collect() 関数を使って中にある pads というリスト定数の資材を取り出します。例えば、player.collect(pads) のようにします。

物置の中には、"peroxide""isopropyl" が備蓄されていますので、これらをすべて歩いて集め、その後外に出て、紫のカーペットの上にある暗い X マークに向かいます。紫のカーペット上では、クレートの方を向いて collect() 関数を使い "water bottle" を取り出し、黄色のカーペット上の暗い X マークに進み、collect() 関数を使って "glass bottle" を取り出します。

これで資材が集められたので、注文を完了させ、右側にある物置のクレートにすべての資材を入れる時間です。まず "water bottle""peroxide""isopropyl"supplies というリストに格納します。次に、redgreenblue のカーペット上の暗い X マークにあるクレートを使用して医療用資材を保管します。そのために、以下の3つのリストを用意します:blue_crate = []green_crate = []red_crate = []

すべての資材を入れる前に、ループを使って各リストに資材を追加し、1つのリストにまとめる必要があります。これにより、すべての supplies が1つのリストにまとめられ、物置のメモに記された order に従って pads アイテムの数が分割されます。

for x in range(5): blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x])

これにもかかわらず、エラーが発生することにお気づきでしょう。すべてが正しく行われ、コードも正しいにもかかわらず、エラーが発生します。問題は、supplies リストには3つのアイテムしかないのに、ループが5回実行され、Index Error が発生する点です。一方、pads リストも3つのアイテムしかなく、しかも注文値の1つが 0 になっているため、任意の数値を 0 で割ると、数学的に定義されていないため Zero Division Error が発生します。

ここで複数の例外処理が有用となります。try / except のコードブロックを使用してエラーをキャッチし、コードの実行を継続させることができます。2種類のエラーが発生するため、それぞれのエラーを特定し、個別にキャッチする必要があります。これは以下のように、except ブロックを拡張することで実現します:except IndexError:except ZeroDivisionError:。例えば:

for x in range(5): try: blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x]) except IndexError: blue_crate.append("glass bottle") except ZeroDivisionError: blue_crate.append(0)

Index Error は、リストの不足している部分に "glass bottle" を補填することで対処され、Zero Division Error は、不正な操作が行われた場合に 0 を追加することで対処されます。

これを blue_crate = []green_crate = []red_crate = [] の各リストに対して行います。bluegreenred のカーペット上の暗い X マークまで歩いて、place() 関数を使用して、それぞれのクレートにリストを保管し、レベルを完了させなさい。

コードブック