고급 파이썬 개발 과정
챕터
>
레벨
예외 처리
예외 마무리하기
목표
사무실로 가서 finally 코드 블록과 assert 키워드를 사용하여 자금 공급이 제대로 균형 잡혔는지 확인하세요.
2층 깊숙한 곳에 농장의 미래 투자를 위한 자금을 보관하는 사무실이 있습니다. 이제 점검하여 모든 장부가 균형을 이루고 있는지 확인할 때입니다. 숫자를 다룰 때는 수학 오류 및 기타 문제가 발생하기 마련이므로, 이번에도 예외 처리를 통해 오류를 포착하고 해결하는 것이 좋습니다.
try / except 및 else 코드 블록 외에도 예외 처리를 마무리할 수 있는 finally 코드 블록이 있습니다. 이와 더불어, assert 키워드는 디버그 기능으로, 코드에 오류가 있는지 검사하여 잘못된 코드를 수정할 수 있도록 도와줍니다.
먼저 사무실 문 앞에 있는 연한 X 표시로 걸어가서 open() 함수를 사용해 문을 열고 입장하세요. 내부에 들어가면 금색 X 표시가 있는 곳으로 이동하여 collect() 함수를 사용해 categories와 savings라는 두 개의 상수를 수집하세요. categories 상수는 확인해야 하는 세 가지 범주인 "exports", "imports", "stock"의 자금 공급을 담고 있는 리스트입니다. savings 상수는 금고가 적절하게 공급되었는지 확인하는 데 필요할 수 있는 자금 공급을 담고 있는 변수입니다.
이제 모든 필요한 항목을 수집했으므로, 나중에 서기가 수집하고 배포할 자루에 보관된 자금 공급의 균형을 맞출 때입니다. blue 카펫 위의 X 표시, 그리고 blue, yellow, red 카펫 위의 X 표시로 걸어가세요. 여기서는 categories 리스트 상수를 사용해 각 자루에 필요한 모든 구성 요소가 들어 있는지 확인합니다.
각 자루는 categories 리스트에 있는 구성 요소들을 모두 포함해야 합니다. 각 자루에 해당하는 세 개의 딕셔너리 상수는 blue_sack, yellow_sack, red_sack 입니다. blue 카펫 위의 X 표시에서 서 있는 동안 for 루프를 실행하여 자루에 필요한 모든 재료가 들어 있는지 확인한 후, 자금 공급이 정확하게 반영되었는지 확인하세요.
for x in range(3): player.speak("%s = %s" % (categories[x] , blue_sack[categories[x]])) player.speak("All assets accounted for")
일부 자루에는 필요한 모든 재료가 있을 수 있지만, 이 연습 문제에서는 일반적으로 오류가 발생할 수 있습니다. 문제가 발생하면, 이번 경우처럼 딕셔너리 키를 찾지 못할 때 발생하는 KeyError:를 포착하기 위해 try / except 코드 블록을 사용해야 합니다. 이 경우, 예외를 마무리하기 위해 항상 마지막에 실행되는 코드를 추가하는 finally를 사용합니다. 예외와 달리 try 당 하나의 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")
yellow 및 red 카펫 위의 어두운 X 표시에서 yellow_sack과 red_sack 딕셔너리 상수를 사용하여 이 과정을 반복하세요. 일부 경우에는 자루에 항목이 누락된 경우에만 오류가 발생하므로 필요하지 않을 수도 있습니다.
자루가 확인되었으니, 이제는 green, purple, orange 카펫 앞의 상자로 이동할 차례입니다. 여기서는 각 상자에 자금 공급이 정확히 30인지 확인한 후 닫아야 합니다. 각 상자에 해당하는 세 개의 변수 상수는 green_chest, purple_chest, orange_chest 입니다.
상자를 확인할 때 가장 큰 문제는 상자의 정확한 내용물을 모른다는 것입니다. 알 수 없는 값을 다룰 때는 assert 키워드를 사용할 수 있습니다. 이 키워드는 선언하는 문이 참인지 거짓인지를 확인할 수 있게 해주어, 코드에 오류가 있는지를 검사하는 데 매우 유용합니다. assert 키워드는 try, except, else, 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() 함수가 호출되어 상자가 닫힙니다.
green, purple, orange 카펫 위의 X 표시에서 상자를 향해 서서 각각의 색깔에 해당하는 green_chest, purple_chest, orange_chest를 사용해 검증을 실행하세요. 완료되면, 연한 X 표시로 걸어가서 place() 함수를 사용해 savings 변수에 남은 자금을 상자에 보관하여 레벨을 완료합니다.