본문 바로가기

Study doc./Python

[Python] 예외 처리 - 아이디 만들기 구현

안녕하세요.

오늘은 간단하게 예외처리(try, except) 문법을 이용해서 간단한 예제를 만들어보았습니다.

 

개념공부만 하는 것보다는 직접 해봐야 머리 속에 잘 들어오더라구요!

그래서 이런 예외 처리를 실무에서는 어떻게 사용할지 한번 생각해보고 간단하게 구현해봤습니다.

(물론 실무에서는 이렇게 사용하지 않겠죠..?)

 

제가 생각해본 예제의 목표는 다음과 같습니다.

 

  • 아이디를 만들기 위해 input 값을 사용자로부터 받을 것
  • 대문자가 포함된 아이디는 에러를 발생시킬 것
  • 특수문자가 포함된 아이디는 에러를 발생시킬 것
  • 사용 가능한 아이디를 입력할때까지 자동 반복될 것

 

그럼 시작해볼까요!!

 


 

먼저 사용자 정의 에러 클래스를 만들었습니다.

처음부터 모든 코드를 작성하는 방법보다, 기존 클래스를 상속받아 함수를 수정하는게 훨씬 쉽습니다.

따라서 Exception 클래스를 상속받는 클래스를 간단하게 생성해줍니다.

 

# 대문자가 포함되어있을때의 에러 클래스
class CapitalError(Exception):
    def __init__(self):
        super().__init__("Warning : Don't use capital letter!!")

# 특수문자가 포함되어있을때의 에러 클래스
class SpecialCharError(Exception):
    def __init__(self):
        super().__init__("Warning : Don't use special character!!")

 

그리고 ID에 대문자, 특수문자가 있는지 확인하는 코드가 필요합니다.

이 함수는 try 구문에 들어갈 예정이고, 

해당 조건에 만족하지 않으면 raise를 통해 에러 클래스를 일부러 발생시킵니다.

 

def SignIn(id_value):
    if id_value.islower() == False: # 모두 소문자가 아니면 에러
        raise CapitalError
    
    elif any([x in id_value for x in '!@#$%^&*']) == True: # 특수문자가 하나라도 들어가있으면 에러
        raise SpecialCharError
        
    else:
        print("{0} is available".format(id_value)) # 그 외에는 사용가능함

 

마지막으로 try와 except를 이용하여 예외처리를 해줍니다.

간단한 원리만 설명드리자면 SignIn 이라는 함수를 try 했을때 raise 를 만나 에러가 발생하면 해당 에러 문구를 출력하고 다시 입력을 받아야 합니다.

따라서 while 과 break를 이용해서 무한루프를 만들어주고, 그 안에 예외 처리 구문을 만들어줍니다.

 

while True:
    try:
        id_value = input("Enter the ID : ")
        SignIn(id_value)
        
    except CapitalError as e: # 에러메세지를 확인하고 싶으면 as 사용
        print(e)
        print("---------- Please retry ----------")
    
    except SpecialCharError as s:
        print(s)
        print("---------- Please retry ----------")
        
    else:
        break
    
    finally:
        print(" ")

 

 

마지막 finally 의 경우에는 try 에서 에러가 발생하든, 하지 않든 수행되는 구문입니다.

보통 try 에서 f.open 을 하는 경우에 finally 에서 f.close 를 사용한다고 하는데, 

저는 매 시도마다 한 줄씩 띄워주도록 print 문을 삽입했습니다.

(굳이 사용하지 않아도 되지만,, 한 번 써보고 싶어서 넣어봤습니다)

 


 

아래는 전체 코드와 결과창입니다.

특수문자와 대문자를 모두 없애니 성공적으로 사용가능한 ID를 확인했습니다.

 

class CapitalError(Exception):
    def __init__(self):
        super().__init__("Warning : Don't use capital letter!!")

class SpecialCharError(Exception):
    def __init__(self):
        super().__init__("Warning : Don't use special character!!")

        

def SignIn(id_value):
    if id_value.islower() == False:
        raise CapitalError
    
    elif any([x in id_value for x in '!@#$%^&*']) == True:
        raise SpecialCharError
        
    else:
        print("{0} is available".format(id_value))


while True:
    try:
        id_value = input("Enter the ID : ")
        SignIn(id_value)
        
    except CapitalError as e: # 에러메세지를 확인하고 싶으면 as 사용
        print(e)
        print("---------- Please retry ----------")
    
    except SpecialCharError as s:
        print(s)
        print("---------- Please retry ----------")
        
    else:
        break
    
    finally:
        print(" ")