Avansert Pythonutviklingskurs
Kapittel
>
Nivå
Unntakshåndtering
Egendefinerte unntak
Mål
Bruk egendefinerte unntak for å samle meldinger med produktbestillinger og sende dem ut via brevduer.
Noen meldinger blir distribuert over gården og til andre stasjoner via budduer; det ville vært en god idé å sende ut noen for å holde seg i forkant av tidsplanen. Vi har fanget opp feil ved å bruke vanlige unntak, men noen ganger kan det være fordelaktig å lage dine egne egendefinerte unntak for svært spesifikke scenarioer. Vi skal hente meldinger og velge duer ved å identifisere de riktige elementene ved hjelp av våre egne egendefinerte unntak.
Egendefinerte unntak lages ved å opprette klasser; ved å legge til (Exception)-klause kan du gjenbruke en klasse for å håndtere unntak. For vårt formål skal vi lage to: InvalidLocation som aktiveres når en spesifikk streng ikke består verifisering, og UnsuitableSelection som brukes for å sjekke om et tall krysser en viss terskel.
class InvalidLocation(Exception):
"Raised when location is invalid"
pass
class UnsuitableSelection(Exception):
"Raised when pidgeon is 2 or younger"
pass
Nå som klassene er satt opp, er det på tide å hente inn notatene slik at de kan sendes ut. Lag en liste med navnet prep for å lagre og kombinere komponentene som trengs for den kommende utvekslingen. Gå til det mørke X-merket over det røde teppet; på rekken av bord med X-merker foran skal vi lete etter notater som har ordre med destinasjon den vestlige delen av gården.
Det er fire variable konstanter som brukes i denne delen: red_memo, blue_memo, green_memo og orange_memo. Kun notater som er merket for levering i "west"-sektoren skal samles inn slik at de kan sendes ut. For å avgjøre om vi skal ta notatet eller ikke, vil vi bruke try/except og else-kodeblokker i kombinasjon med det egendefinerte unntaket InvalidLocation. For å bruke det egendefinerte unntaket, la try sjekke om notatet er merket med "west" og, hvis det ikke er det, kaste unntaket. except-blokken bekrefter at notatet er ugyldig, og else-blokken samler inn, og legger til i prep-listen, notatet dersom det viser seg at det er til destinasjonen "west"-sektoren. For eksempel:
try: if red_memo != "west": raise InvalidLocation except InvalidLocation: player.speak("This is not an order that needs to be sent out") else: player.collect(red_memo) prep.append(red_memo)
Gå til hvert av de mørke X-markene over de fargede teppene foran bordene og kjør unntakssekvensen med de riktige variable konstantene som tilsvarer hver farge.
Når du har samlet inn notatene, gå til det gullfargede X-merket foran døren og bruk open()-funksjonen for å få tilgang til duenburene. Når du er inne, gå til det lyse X-merket, snu deg, og bruk close()-funksjonen for å lukke døren slik at ingen duer slipper unna.
Gå til det mørke X-merket over det lilla teppet; ved pennen skal vi verifisere om duen er gammel nok til å levere en melding, eller om den er en unge som ikke kan foreta en levering. Det er fire flere variable konstanter som skal brukes i denne delen: purple_pen, yellow_pen, white_pen og pink_pen som tilsvarer hvert farget teppe. Vi skal bruke samme teknikk som med notatene, ved å bruke den andre klassen som ble satt opp.
Bruk try/except og else-kodeblokker med det egendefinerte unntaket UnsuitableSelection for å identifisere om duen er gammel nok til å foreta leveringen. try-blokken verifiserer om variabelkonstanten som representerer pennen har en passende due ved å sjekke om fuglen er yngre enn to (2) år. Hvis duen er upassende, blir except-blokken aktivert, ellers utløses else-blokken som lar deg legge til duen i prep-listen for å levere meldingen.
try: if purple_pen <= 2: raise UnsuitableSelection except UnsuitableSelection: player.speak("Pigeon unsuitable to deliver") else: prep.append(purple_pen) player.speak("Pigeon Collected")
Gå til hvert mørke X-merke over de fargede teppene og bruk denne sekvensen med den riktige variable konstanten som tilsvarer det riktige fargeteppet. Når du har samlet inn duer og meldinger, gå til det gullfargede X-merket helt nederst og bruk place()-funksjonen med den prep-listen du opprettet for å sende ut duene for å levere meldinger og fullføre nivået.