본문 바로가기

나도코딩 파이썬

[나도코딩 파이썬기초(10)] 예외처리(except), Class 예외처리(Exception), as arr로 사용자정의 예외처리, finally

예외처리

에러가 발생했을 때, 터미널상 에러가 나서 멈추는 것이 아니라

예상되는 에러에 원하는 문장 등이 나타나게 할 수 있다.

 

먼저 실행하고자 하는 코드를

try:

아래 입력하고,

 

except (에러이름):

이런식으로 예상되는 에러를 예외처리 할 수 있다.

 

except (에러이름) as err:

print(err)

이렇게 입력하면 해당 에러의 종류가 화면에 표시된다.

 

예상되는 에러가 아닌 에러 예외처리하기

참고로 .append()를 통해 리스트에 추가할 때도

input함수를 넣어 입력값을 넣을 수 있다.

 

마지막 코드인

except Exception as err:

print(err)

 

정확한 에러의 명칭을 출력하기 위해서는

(에러이름) as err 을 except 이후에 써주어야한다.

 

여기서는 Exception as err이라고 표시했다.

(정해진 에러가 아닌 그 외의 에러일 경우이므로)

 

에러발생시키기

raise (에러이름) ... 해당 에러가 발생할 경우 이후 코드는 작동하지 않고 바로 에러처리가 되게 한다.

 

여기서는 에러 이름을 ValueError로 하고,

except ValueError:

print("잘못된 값을 입력했습니다")라고 처리했다.

 

raise ValueError 에서 에러처리를 했으므로

이후 print는 실행되지않고 바로 에러처리가 되었다.

 

사용자정의 예외처리

클래스로 에러명(Exception):

pass

 

이렇게해서 에러내용을 표시하지않고

바로 except 처리를 시키는 방법도 있지만,

해당 에러의 설명을 추가할 수도 있다.

 

우선 클래스이므로 def __init__함수를 생성하고

msg라는 전달값을 생성한다.

 

def __str__(self): ... 또 다른 함수 생성

return self.msg

 

해당 클래스(전달값 msg)을 반환해준다.

=> 이 값을 print(err)에서 출력해준다.

 

raise BigNumberError( msg )

괄호안의 전달값을 문장으로 입력한 뒤,

format(num1, num2)로 input값이 들어오게함.

 

print(err)에서 해당 내용이 표시된다.

 

Finally 

try :

이후에 나오는 예외처리 구문에서

정상적으로 출력되든, 오류가 나든

상관없이 무조건 실행되는 구문이다.

 

정상적으로 작동해도 finally 문장이 출력되고,

 

이렇게 오류가 발생하더라도 구문이 뜨게된다.

 

사용하는 이유는,

강제종료되어 문제가 발생하지 않도록

완성도를 높여주는 기능을 하기 때문이다.

 

예외처리 퀴즈

 

 

내 코드
from logging import exception


class SoldOutError(Exception):
    pass

try:
    chicken = 10
    waiting = 1 # 홀 안에는 현재 만석, 대기번호 1부터 시작
    while(True):
        print("남은 치킨 : {0}".format(chicken))
        order = int(input("치킨 몇 마리 주문하시겠어요?"))
        if order > chicken: #남은 치킨보다 주문량이 많을 때
            print("재료가 부족합니다. 적은 양으로 주문해주세요")
        
        elif not 1 <= order <= 10:
            raise ValueError

        else:
            print("[대기번호 {0}] {1}마리 주문이 완료되었습니다."\
                .format(waiting,order))
            waiting += 1
            chicken -= order

        if chicken == 0:
            raise SoldOutError

except ValueError:
    print("잘못된 값을 입력하였습니다.")
except SoldOutError as err:
    print("재고가 소진되어 더 이상 주문을 받지 않습니다.")

 

정답코드

다른 부분은 거의 같고

break 로

while문을 탈출하는 점 포인트.