Gevorderde Python-ontwikkelingscursus
Hoofdstuk
>
Niveau
Uitzonderingsafhandeling
Meerdere uitzonderingen
Doelstelling
Verzamel en sla enkele medische voorraden correct op in kratten door gebruik te maken van meerdere uitzonderingen.
De opslagruimtes op het dak moeten worden aangevuld, sommige voorraden zijn gebruikt maar nooit vervangen. Er is in een memo in een van de opslagruimtes een bestelling geplaatst voor meer materialen; het zou een goed idee zijn om dit af te handelen. Dat gezegd hebbende, zijn er verschillende materialen die samengevoegd en in kratten opgeslagen moeten worden.
Vanwege de verschillende datatypes en het aantal materialen dat nodig is om kratten te vullen, kunnen er diverse fouten optreden. We kunnen try / except gebruiken om eventuele fouten op te vangen en sommige problemen op te lossen, maar wat als er meerdere mogelijke fouten kunnen optreden in één enkele bewerking? Om dit aan te pakken, kunnen we specificeren welke uitzonderingen we proberen op te vangen en meerdere uitzonderingen gebruiken.
Begin door naar het gouden X-teken te lopen en richt je naar de deur, gebruik de open() functie om de opslagkamer binnen te gaan. Eenmaal binnen loop je naar het donkere X-teken en draai naar rechts om de read() functie te gebruiken en te controleren welke materialen en hoeveelheden er in de memo op de tafel worden besteld. Informatie over lijstconstanten staat in de memo, inclusief voorraden en de bestellingen daarvoor. Als je klaar bent, loop je naar het lichte X-teken in de opslagruimte, draai naar de krat en pak de lijstconstante pads met materialen via de collect() functie, zoals dit: player.collect(pads) .
In de opslagruimte zijn voorraden van "peroxide" en "isopropyl". Loop erheen en verzamel ze allemaal, ga vervolgens naar buiten en begeef je naar het donkere X-teken over een paars tapijt. Op het paarse tapijt, terwijl je naar de krat kijkt, gebruik je de collect() functie om de "water bottle" te pakken, ga vervolgens naar het donkere X-teken over het gele tapijt en gebruik de collect() functie om de "glass bottle" te pakken.
Nu de items verzameld zijn, is het tijd om de bestelling uit te voeren en alle materialen in de opslagkratten aan de rechterzijde te plaatsen. Hiervoor slaan we eerst de: "water bottle", "peroxide" en "isopropyl" op in een lijst genaamd supplies. Op de donkere X-tekens over de rode, groene en blauwe tapijten gebruiken we de kratten om de medische voorraden op te slaan. Hiervoor maken we drie lijsten aan: blue_crate = [], green_crate = [] en red_crate = [].
Voordat we alle items plaatsen, moeten we alle lijsten vullen met de materialen. Hiervoor gaan we een lus gebruiken om door de lijsten te itereren en ze samen te voegen tot één enkele lijst. Hierdoor komen alle supplies in de lijst te staan en wordt het aantal pads-items verdeeld volgens de bestelling in de memo in de opslagruimte.
for x in range(5): blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x])
Ondanks dat alles correct wordt uitgevoerd en de code in orde lijkt, zul je merken dat er fouten optreden. Het probleem is dat de supplies lijst slechts drie (3) items bevat, maar de lus vijf (5) keer draait, wat een Index Error veroorzaakt. Ondertussen bevat de pads lijst niet alleen ook maar drie (3) items, maar is ook een van de orderwaarden 0. Elk getal gedeeld door 0 veroorzaakt een Zero Division Error omdat in de wiskunde geen getal door 0 kan worden gedeeld.
Dit is waar meerdere uitzonderingen nuttig zijn. We gebruiken de try / except codeblokken om de fouten op te vangen en zo de code te laten doorgaan. Aangezien er twee fouten optreden, moeten we elke fout identificeren om de specifieke uitzonderingen op te vangen. Dit doen we door de except codeblokken als volgt uit te breiden: except IndexError: en except ZeroDivisionError:. Bijvoorbeeld:
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)
De Index Error wordt verholpen door de ontbrekende plekken in de lijst op te vullen met "glass bottle" en de Zero Division Error wordt opgelost door een waarde van 0 toe te voegen als de illegale actie plaatsvindt.
Doe dit voor de blue_crate = [], green_crate = [] en red_crate = [] lijsten. Loop naar het donkere X-teken over de blauwe, groene en rode tapijten en gebruik de place() functie om de lijsten in de corresponderende kratten op te slaan om zo het level te voltooien.