파이썬 강좌(초급)/9.예외처리

9.예외처리 - 2) 사용자정의 예외, finally 키워드

파기차차 2024. 4. 7. 15:57
728x90
반응형
SMALL

 

1) 에러 발생 시키기

 

아래 코드는 비밀번호 4개를 숫자 1자리씩 입력하는 프로그램입니다. 그런데 숫자가 1자리가 아닌 2자리(아래에서 ‘44’)를 입력하는 경우 일부러 에러를 발생시키도록 할 수 있습니다.

try:
    print("비밀번호 숫자 4자리를 입력하세요 : ")
    num1 = int(input("첫번째 숫자 입력 : "))
    num2 = int(input("두번째 숫자 입력 : "))
    num3 = int(input("세번째 숫자 입력 : "))
    num4 = int(input("네번째 숫자 입력 : "))
    if num1 >=10 or num2 >=10 or num3 >=10 or num4 >=10:
        raise ValueError
    print("입력한 숫자 4 : ", num1, num2, num3, num4)
except ValueError:
    print("비밀번호를 잘못 입력하였습니다. 한자리 숫자만 입력해 주세요.")

비밀번호 숫자 4자리를 입력하세요 :

첫번째 숫자 입력 : 1

두번째 숫자 입력 : 2

세번째 숫자 입력 : 3

네번째 숫자 입력 : 44

비밀번호를 잘못 입력하였습니다. 한자리 숫자만 입력해 주세요.

 

 

 

 

 

 

2) 사용자 정의 예외처리

 

 

사용자 정의 예외처리는 에러 발생 시 사용자가 직접 예외처리 구문을 만들어 주는 것입니다.

아래에서 비밀번호를 2자리 숫자를 입력하는 경우 Exception 클래스를 상속받은 사용자가 만든 BigNumberError클래스로 예외를 던지고(raise BigNumberError) except BigNumberError 구문 이하가 받아서 처리하고 있습니다.

 

class BigNumberError(Exception): # 예외처리를 위한 빈 클래스를 정의
    pass
 
 
try:
    print("비밀번호 숫자 4자리를 입력하세요 : ")
    num1 = int(input("첫번째 숫자 입력 : "))
    num2 = int(input("두번째 숫자 입력 : "))
    num3 = int(input("세번째 숫자 입력 : "))
    num4 = int(input("네번째 숫자 입력 : "))
    if num1 >=10 or num2 >=10 or num3 >=10 or num4 >=10:
        # raise ValueError
        raise BigNumberError
    print("입력한 숫자 4 : ", num1, num2, num3, num4)
except ValueError:
    print("비밀번호를 잘못 입력하였습니다. 한자리 숫자만 입력해 주세요.")
except BigNumberError:
    print("에러가 발생하였습니다. 한자리 숫자만 입력해 주세요.")

비밀번호 숫자 4자리를 입력하세요 :

첫번째 숫자 입력 : 1

두번째 숫자 입력 : 2

세번째 숫자 입력 : 3

네번째 숫자 입력 : 44

에러가 발생하였습니다. 한자리 숫자만 입력해 주세요.

 

에러 상황을 좀 더 구체적으로 알려주기 위해 예외처리를 발생시킬 때 인자로 값을 던저주고, 아래와 같이 에러 메시지에 해당 값을 넣어줄 수 있습니다.

 
class BigNumberError(Exception):
    def __init__(self, msg):
        self.msg = msg
 
    def msg(self):
        return self.msg
 
 
try:
    print("비밀번호 숫자 4자리를 입력하세요 : ")
    num1 = int(input("첫번째 숫자 입력 : "))
    num2 = int(input("두번째 숫자 입력 : "))
    num3 = int(input("세번째 숫자 입력 : "))
    num4 = int(input("네번째 숫자 입력 : "))
    if num1 >=10 or num2 >=10 or num3 >=10 or num4 >=10:
        # raise ValueError
        # raise BigNumberError("입력값 : " + str(num1) + str(num2) + str(num3) + str(num4))
        raise BigNumberError("입력값 : {0} {1} {2} {3}".format(num1, num2, num3, num4))
    print("입력한 숫자 4 : ", num1, num2, num3, num4)
except ValueError:
    print("비밀번호를 잘못 입력하였습니다. 한자리 숫자만 입력해 주세요.")
except BigNumberError as err:
    print("에러가 발생하였습니다. 한자리 숫자만 입력해 주세요.")
    print(err)

비밀번호 숫자 4자리를 입력하세요 :

첫번째 숫자 입력 : 1

두번째 숫자 입력 : 2

세번째 숫자 입력 : 3

네번째 숫자 입력 : 44

에러가 발생하였습니다. 한자리 숫자만 입력해 주세요.

입력값 : 1 2 3 44

 

 

 

3) finally

 

1) finally 키워드가 뭐에요.?

Finally 키워드는 에러 발생 유무에 상관없이 무조건 finally 이하 구문이 실행되게 해주는 키워드 입니다.

 

아래의 경우 비밀번호를 2자리 입력하여 에러를 일으켰지만, 그것과는 상관없이 finally 이하 구문(print(“수고하셨습니다.”))이 실행되는 것을 볼 수 있습니다.

class BigNumberError(Exception):
    def __init__(self, msg):
        self.msg = msg
 
    def msg(self):
        return self.msg
 
 
try:
    print("비밀번호 숫자 4자리를 입력하세요 : ")
    num1 = int(input("첫번째 숫자 입력 : "))
    num2 = int(input("두번째 숫자 입력 : "))
    num3 = int(input("세번째 숫자 입력 : "))
    num4 = int(input("네번째 숫자 입력 : "))
    if num1 >=10 or num2 >=10 or num3 >=10 or num4 >=10:
        # raise ValueError
        # raise BigNumberError("입력값 : " + str(num1) + str(num2) + str(num3) + str(num4))
        raise BigNumberError("입력값 : {0} {1} {2} {3}".format(num1, num2, num3, num4))
    print("입력한 숫자 4 : ", num1, num2, num3, num4)
except ValueError:
    print("비밀번호를 잘못 입력하였습니다. 한자리 숫자만 입력해 주세요.")
except BigNumberError as err:
    print("에러가 발생하였습니다. 한자리 숫자만 입력해 주세요.")
    print(err)
finally:
    print("수고하셨습니다.")

비밀번호 숫자 4자리를 입력하세요 :

첫번째 숫자 입력 : 1

두번째 숫자 입력 : 2

세번째 숫자 입력 : 3

네번째 숫자 입력 : 44

에러가 발생하였습니다. 한자리 숫자만 입력해 주세요.

입력값 : 1 2 3 44

수고하셨습니다.

 

 

 

4)실습

 

(1) 어떤 값을 0으로 나누면 ZeroDivisionError 에러가 발생합니다. try ~ except로 모든 에러에 대해 예외처리하지 말고 ZeroDivisionError 에러만 예외처리해보세요.

 

모범답안

더보기
try:
    b = 3 / 0
except ZeroDivisionError:
    print("0으로 나누면 안되요")

 

 

(2) 다음과 같은 코드 구조를 사용하면 예외 발생 시 에러 메시지를 변수로 바인딩할 수 있습니다.

try:
    실행코드
except 예외 as 변수:
    예외처리코드

 

리스트의 인덱싱에 대해 에러를 출력해보세요.

 

data = [1, 2, 3]

for i in range(5)
    print(data[i])

 

 

모범답안

더보기
data = [1, 2, 3]

for i in range(5):
    try:
        print(data[i])
    except IndexError as e:
        print(e)

 

 

 

 

(3) 파이썬 예외처리는 다음과 같은 구조를 가질 수 있습니다

 

try:
    실행 코드
except:
    예외가 발생했을 때 수행할 코드
finally:
    예외 발생 여부와 상관없이 항상 수행할 코드

 

아래의 코드에 대해서 예외처리를 사용하고 try, except, finally에 적당한 코드를 작성해 보세요. finally는 적당한 문구를 print하시면 됩니다.

per = ["10.31", "", "8.00"]

for i in per:
    print(float(i))

 

 

모범답안

더보기
per = ["10.31", "", "8.00"]

for i in per:
    try:
        print(float(i))
    except:
        print(0)
    finally:
        print("변환 완료")

 

728x90
반응형
LIST

'파이썬 강좌(초급) > 9.예외처리' 카테고리의 다른 글

9.예외처리 - 1) 개요  (0) 2024.04.07