Python 예외 처리

dumbbelldore·2024년 11월 7일
0

zero-base 33기

목록 보기
10/97

1. 예외(Exception)

  • 예외란 문법적인 문제는 없으나 실행 중 발생하는 예상하지 못한 문제를 말함
print(2/0)

# 출력예시
# ERROR!
# Traceback (most recent call last):
#   File "<main.py>", line 1, in <module>
# ZeroDivisionError: division by zero

2. 예외 처리

  • 적절한 예외 처리는 프로그램 전체 실행에 대한 영향을 최소화 할 수 있음
  • 예외 발생 예상 부분을 try ~ except ~ 구문으로 감싸서 처리함
try:
	print(2/0) # 오류발생 예상 부분
    
except:
	print("예외가 발생하였으나, 다음 항목 실행에는 문제가 없습니다.")
    
print(4/2)

# 출력예시
# 예외가 발생하였으나, 다음 실행에는 문제가 없습니다.
# 2.0
  • try ~ except ~ else ~ 구문을 사용하면 예외가 발생하지 않는 경우에 대해서 실행할 수 있는 프로그램을 제한할 수 있음
  • 예외 발생과 상관없이 항상 실행이 필요한 부분은 finally 구문 안에 포함시켜야 함
try:
	input_data = input("정수를 입력하세요: ")
	input_num = int(input_data)

except:
    print("올바른 정수를 입력하세요.")
    
else:
    odd_even = "홀수" if input_num % 2 == 1 else "짝수"
    print(f"입력한 정수는 {odd_even}입니다.")
    
finally:
    print(f"(참고) 입력 데이터: {input_data}")

# 출력예시(정상)
# 정수를 입력하세요: 4
# 입력한 정수는 짝수입니다.
# (참고) 입력 데이터: 4

# 출력예시(예외)
# 정수를 입력하세요: a
# 올바른 정수를 입력하세요.
# (참고) 입력 데이터: a
	

3. 숫자 입력 프로그램

  • 사용자로부터 5개의 숫자를 입력받아 출력하는 프로그램을 만드시오. (단, 정수가 아닌 숫자형을 입력받은 경우를 대비하여 적절한 예외처리를 수행하시오.)
num_list = []
counter = 1

while counter < 6:
    
    try:
        num = int(input("정수를 입력하세요: "))
        
    except:
        print("정수가 입력되지 않았습니다.")
        continue # 정수 미입력 시, 이하 생략
    
    num_list.append(num)
    counter += 1

print(f"입력된 숫자 목록: {num_list}")

# 출력예시
# 정수를 입력하세요: 1
# 정수를 입력하세요: a
# 정수가 입력되지 않았습니다.
# 정수를 입력하세요: b
# 정수가 입력되지 않았습니다.
# 정수를 입력하세요: 5
# 정수를 입력하세요: 6
# 정수를 입력하세요: 9
# 정수를 입력하세요: 3
# 입력된 숫자 목록: [1, 5, 6, 9, 3]

4. Exception 클래스

  • Exception 클래스를 코딩에 활용하면 원하는 구문과 함께 상세 예외 유형을 출력할 수 있음
try:
    input_data = int(input("10 이하의 정수를 입력하세요: "))

except Exception as e:
    print(f"에러가 발생했습니다. (사유: {e})")
    
# 출력예시
# 정수를 입력하세요: a
# 에러가 발생했습니다. (사유: invalid literal for int() with base 10: 'a')
  • raise 키워드를 활용하면 강제로 예외를 발생시킬 수 있음
10 이하의 정수를 입력하세요: 20
ERROR!
Traceback (most recent call last):
  File "<main.py>", line 4, in <module>
ValueError: (에러발생) 10 이하의 정수를 입력헤주세요.

# 출력예시(ValueError)
# 10 이하의 정수를 입력하세요: 20
# ERROR!
# Traceback (most recent call last):
#   File "<main.py>", line 4, in <module>
# ValueError: (에러발생) 10 이하의 정수를 입력헤주세요.

5. SMS-MMS 자동 전환 발송 프로그램

  • 사용자가 문자 메시지를 보낼 때 10글자 이하면 SMS로 발송하고, 10글자 초과 시 MMS로 발송하는 프로그램을 만드시오. (단, 각 경우에 따른 예외처리를 통해 자동 전환되어 발송되게 구현하시오.)
def send_sms(text):
    if len(text) > 10:
        raise Exception("(경고) 10글자 초과로 MMS로 전환 발송", 1) # 변수(1) 바인딩
    
    else:
        print("SMS 발송 완료")

def send_mms(text):
    if len(text) <= 10:
        raise Exception("(경고) 10글자 이하로 SMS로 전환 발송", 2) # 변수(2) 바인딩딩
    
    else:
        print("MMS 발송 완료")

text = input("발송 내용 입력: ")
print(f"총 글자수: {len(text)}, SMS 발송중... ")

try:
    send_sms(text)

except Exception as e:

    # 바인딩한 변수를 활용하여 자동 전환발송 기능 구현
    if e.args[1] == 1:
        print(e.args[0])
        send_mms(text)
    
    elif e.args[1] == 2:
        print(e.args[0])
        send_sms(text)
        
# 출력예시
# 발송 내용 입력: this is a test message.
# 총 글자수: 23, SMS 발송중... 
# (경고) 10글자 초과로 MMS로 전환 발송
# MMS 발송 완료

6. 사용자 정의 예외

  • Exception 클래스를 상속하여 사용자 정의 예외 클래스를 생성할 수 있음
class StopWordException(Exception):
    
    def __init__(self, word):
        super().__init__(f"'{word}'는 사용하실 수 없는 닉네임입니다.")

# 금칙어 목록 정의
stop_word_list = ['관리자', '운영자']

input_word = input("사용하실 닉네임을 입력하세요: ")

if input_word in stop_word_list:
    raise StopWordException(input_word)

else:
    print(f"'{input_word}'는 사용하실 수 있는 닉네임입니다.")

# 출력예시(금칙어 미사용 시)
# 사용하실 닉네임을 입력하세요: 홍길동
# '홍길동'는 사용하실 수 있는 닉네임입니다.

# 출력예시(금칙어 사용 시)
# 사용하실 닉네임을 입력하세요: 관리자
# Traceback (most recent call last):
#   File "<main.py>", line 12, in <module>
# StopWordException: '관리자'는 사용하실 수 없는 닉네임입니다.

*이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.

profile
데이터 분석, 데이터 사이언스 학습 저장소

0개의 댓글