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

例外処理
例外のまとめ

目標

オフィスに行って、finally コードブロックと assert キーワードを使用して、金銭供給が正しくバランスされていることを確認しましょう。

2階の奥深くに、農場の将来の投資のための資金を保管する専用のオフィスがあります。そろそろ確認して、すべての勘定が合っているか確かめる時です。数字を扱う際には計算ミスやその他の問題が起こるのは避けられないため、例外処理を使ってエラーを捕捉し、解決するのが良い考えです。

try / except および else コードブロックに加えて、例外を締めくくる finally コードブロックもあります。それに加えて、assert キーワードは、コードにエラーがないかチェックするデバッグ機能で、不具合のあるコードを修正するのに役立ちます。

最初に、オフィスのドアの前にある薄い X マークのところへ歩み、open() 関数を使用してドアを開け、中に入ります。中に入ったら、金色の X マークのところへ進み、collect() 関数を使って、categoriessavings という2種類の定数を取得します。categories 定数は、検証が必要な3つのカテゴリー、すなわち "exports"、"imports"、"stock" の金銭供給を保持するリストです。savings 定数は、金庫に十分な供給があるかを確認するために必要な金銭供給を保持する変数です。

すべての必要なアイテムが集まったので、作業終了後に事務員によって回収・配布される袋に保管された金銭供給のバランスを取る時が来ました。 カーペット上の濃い X マーク、そして カーペット上の X マークへと歩んでください。ここでは、categories リスト定数を使用して、各袋に必要な全ての要素が揃っているかを検証します。

各袋には categories リスト内に記載された要素が含まれている必要があります。各袋に対応する3つの辞書定数、blue_sackyellow_sack、そして red_sack があります。 カーペット上の X マークに立ち、for ループを実行して、その袋に必要なすべての材料が揃っているかを確認し、供給が計上されていることを確かめてください。

for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) player.speak("All assets accounted for")

いくつかの袋には必要な材料が全て揃っているはずですが、この演習では例外的にエラーに遭遇する可能性があります。もし問題が発生した場合は、try / except コードブロックを使用して、この場合は辞書のキーが見つからないと発生する KeyError: を捕捉しなければなりません。このような場合、例外処理の最後に必ず実行されるコードを追加するために finally を使用して例外処理を締めくくります。例外処理とは異なり、try ブロックごとに1つの finally ブロックしか使用できません。例えば、blue_sack の場合は:

try: for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) except: player.speak("Bag is missing %s, adding now" % (categories[x])) player.place(categories[x]) finally: player.speak("All assets accounted for")

このプロセスを、 および カーペット上の濃い X マークでも、yellow_sackred_sack の辞書定数を使用して繰り返してください。袋に欠品がある場合にのみエラーが発生するため、場合によっては必要ないかもしれません。

袋の検証が終わったら、次は カーペットの前にあるチェストに移ります。ここでは、各チェストの金銭供給が正確に30であることを確認し、その後チェストを閉じる必要があります。各チェストに対応する3つの変数定数は、それぞれ green_chestpurple_chestorange_chest です。

チェストの検証で最大の問題は、その正確な内容が不明であるという点です。未知の値を扱う際には assert キーワードを使用できます。このキーワードにより、宣言している文が真か偽かを検証でき、コードにエラーがないかをチェックするのに非常に役立ちます。assert キーワードは、tryexceptelse、および final と併せて使用することで、エラーのあるコードを修正するために利用されます。例えば、green_chest の場合は:

try: assert(green_chest = 30) except AssertionError: player.speak("Chest is not full %s/30" % green_chest) drop = 30-green_chest savings -= drop player.place(drop) else: player.speak("All assets accounted for") finally: player.close()

上記のコードでは、assert キーワードを使用して green_chest が正しい金銭供給量を含んでいるかを確認します。もし正しい供給量が含まれていなければ、except ブロックが発動し、不足分を計算して savings 変数から差し引き、チェストに追加します。供給が完全であれば、else ブロックが発動し、すべての資産が計上されていることが確認されます。すべてが検証された後、finally ブロックが実行され、close() 関数が呼び出されてチェストが閉じられます。

カーペット上の X マークのところでチェストに向かい、各カーペットに対応する green_chestpurple_chestorange_chest を用いて検証を実行してください。完了したら、薄い X マークのところへ歩み、place() 関数を使用して savings 変数の残りをクレートに保管し、レベルを完了させます。

コードブック