Курс по усъвършенствано разработване с Python
Глава
>
Ниво
Обработка на изключения
Множество изключения
Цел
Съберете и правилно съхранете някои медицински консумативи в кутии чрез използване на множество изключения.
Складовете на покрива трябва да бъдат презаредени, тъй като някои от материалите са били използвани, но никога не са били заменени. В един от складовете има меморандум с поръчка за допълнителни материали; добра идея е да се погрижим за това. Казано това, има разнообразие от различни материали, които трябва да бъдат събрани и съхранени в кутии.
Поради различните типове данни и броя на материалите, необходими за запълване на кутийките, можем да се сблъскаме с различни грешки. Можем да използваме try / except, за да прихванем възможни грешки и да коригираме някои от тях, но какво се случва, когато има множество възможни грешки, които може да срещнете при една операция? За да се справим с това, можем да посочим кои изключения се опитваме да прихванем и да използваме множество изключения.
За начало, тръгнете към златния X знак и обърнете лице към вратата; използвайте функцията open() за да влезете в склада. Веднъж вътре, тръгнете към тъмния X знак и завийте надясно, за да използвате функцията read() и да проверите какви материали и в какви количества се поръчват според меморандума на масата. Информация за константните списъци е написана в меморандума, включително консумативите и поръчките за тях. След като приключите, тръгнете към светлия X знак вътре в склада, обърнете се към кутията и вземете списъчната константа pads с материалите, използвайки функцията collect(), както следва: player.collect(pads).
В склада има запаси от "peroxide" и "isopropyl". Тръгнете и съберете всички тях, след което излезте и се насочете към тъмния X знак върху лилав килим. На лилавия килим, докато сте обърнати към кутията, използвайте функцията collect() за да вземете "water bottle", преминете към тъмния X знак върху жълт килим и използвайте функцията collect(), за да вземете "glass bottle".
Сега, когато материалите са събрани, е време да изпълните поръчката и да поставите всички материали в кутийките в склада вдясно. За това първо ще съхраним: "water bottle", "peroxide" и "isopropyl" в списък, наречен supplies. На тъмните X знаци върху килимите в цвят red, green и blue ще използваме кутийките за съхранение на медицинските консумативи. За това ще създадем три списъка: blue_crate = [], green_crate = [] и red_crate = [].
Преди да поставим всички елементи, трябва да запълним списъците с материалите. За това ще използваме цикъл, за да обходим списъците и да ги комбинираме в един общ списък. Това ще постави всички supplies в списъка и ще разпредели броя на елементите от pads според order в меморандума в склада.
for x in range(5): blue_crate.append(supplies[x]) blue_crate.append(pads[x]/order[x])
Въпреки това ще забележите, че ще се появят грешки, въпреки че всичко е направено правилно и кодът е коректен. Проблемът е, че списъкът supplies съдържа само три (3) елемента, но цикълът се изпълнява пет (5) пъти, което причинява Index Error. Междувременно, списъкът pads съдържа също само три (3) елемента, както и едната от стойностите в order е 0, като всяко число, разделено на 0, води до Zero Division Error, тъй като в математиката няма делене на 0.
Тук идват в помощ множествените изключения. Използваме блоковете try / except, за да прихванем грешките и да продължим с изпълнението на кода. Тъй като възникват две грешки, трябва да идентифицираме всяка грешка, за да прихванем конкретното изключение. Това се прави чрез разширяване на блоковете 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 = []. Тръгнете към тъмния X знак върху килимите в цвят blue, green и red и използвайте функцията place(), за да поставите списъците в съответните кутийки, за да завършите нивото.