Python

Python(15) 예외 처리와 오류 관리

UserDonghu 2023. 9. 19. 23:07

Error의 종류

# Syntax Error 문법 에러
for i in range(10)
	print(i)

 

# Name Error 이름 에러
print(x)

 

# Type Error 타입 에러
x = 10
y = '20'
print(x + y)

 

# Index Error 인덱스 에러
my_list = [1, 2, 3]
print(my_list[3])

 

# Key Error 키 에러
my_dict = {'a': 1, 'b': 2}
print(my_dict['c'])

 

# Value Error 값 에러
int('a')

 

# ZeroDivision Error 0 나누기 에러
x = 10
y = 0
print(x / y)

 

# Attribute Error 어트리뷰트 에러 : 객체에 존재하지 않는 속성이나 메서드 호출
my_list = [1, 2, 3]
print(my_list.appeend(4))

 

# Type Error 인자 개수 에러
def add(x, y):
    return x + y

add(1, 2, 3)

 

# File I/O Error 파일 입/출력 에러
f = open('non-existent.txt', 'r')
f.read()

 

예외 처리

try except 사용

try:
    # 예외가 발생할 가능성이 있는 코드
except:
    # 예외 처리 코드
    
try:
    # 예외가 발생할 가능성이 있는 코드
except 애러명:
    # 애러명 예외 처리 코드

 

try:
    할인율 = 0
    치킨값 = 30000 / 할인율
    print('치킨주문 되었습니다.')
except:
    print('결제가 안되었습니다!')
    
# 결제가 안되었습니다!

 

else 문

에러 없이 실행되면 else를 실행. while, for 에 else와 비슷함.

try:
    할인율 = 0
    # 치킨값 = 30000 / 할인율
    print('치킨주문 되었습니다.')
except:
    print('결제가 안되었습니다!')
else: # 에러 없이 실행되면 else를 실행합니다. while, for + else 조합과 비슷합니다.
    print('else')
    
# 치킨 주문 되었습니다.
# else

 

finally

무조건 실행

try:
    할인율 = 0
    치킨값 = 30000 / 할인율
    print('치킨주문 되었습니다.')
except:
    print('결제가 안되었습니다!')
finally: # 무조건 실행
    print('메인화면으로 이동')
    
# 결제가 안되었습니다!
# 메인화면으로 이동

 

에러 발생시키기

 

assert

test = 'hello'
assert test == 'hello', '에러 메시지 1'
assert test == 'world', '에러 메시지 2'
assert test + 3 == 5, '에러 메시지 3'

# AssertionError: 에러 메시지 2

 

raise

x = 10
raise ValueError('코드를 잘~~ 만들어주세요')
y = 20

# ValueError: 코드를 잘~~ 만들어주세요

 

에러 직접 만들기

class MyError(Exception): #Exception을 상속받음
    def __init__(self):
        super().__init__('내가 만든 에러')

raise MyError

# MyError: 내가 만든 에러

 

로깅

import logging

logging.basicConfig(level=logging.warning) # 어느 레벨부터 로깅할지, 기본으로 warning 부터 로깅

logging.debug("This is a debug message") # 고쳐야 할 코드, 기록 필요
logging.info("This is an info message") # 정보성 메시지
logging.warning("This is a warning message") # 경고 메시지
logging.error("This is an error message") # 애러 메시지(프로그램은 동작)
logging.critical("This is a critical message") # 프로그램 중지(애러처리 안된경우)

# WARNING:root:This is a warning message
# ERROR:root:This is an error message
# CRITICAL:root:This is a critical message

 

아래는 너무 알게 많으니까 일단 이런게 있구나 알아만 두자... 일일히 이해하는건 나중에..

import logging.handlers

def logger():
    log_obj = logging.getLogger("log_name") # log name으로 log 객체 생성
    log_obj.setLevel(logging.DEBUG) # 어디부터 기록할지 설정

    # fileHandeler = logging.FileHandler(filename="./test.txt") # 파일로 기록
    streamHandler = logging.StreamHandler() # 콘솔에 출력

    fileHandeler.setLevel(logging.INFO) # 파일 기록 레벨 설정
    # streamHandler.setLevel(logging.DEBUG) # 콘솔 기록 레벨 설정

    formatter = logging.Formatter("%(name)s, %(asctime)s, %(levelname)s, %(message)s") #포멧 생성

    fileHandeler.setFormatter(formatter) # 파일 메시지 포멧 설정
    # streamHandler.setFormatter(formatter) # 콘솔 메시지 포멧 설정

    log_obj.addHandler(fileHandeler) # log_obj handler에 파일 출력 방식 추가
    # log_obj.addHandler(streamHandler) # log_obj handler에 파일 콘솔 방식 추가

    return log_obj

log = logger()

# 아래 코드를 기록하고 싶은 곳에 함께 설정
log.debug('debug')
log.info('info')
log.warning('warning')
log.error('error')
log.critical('critical')

print('---')

# 아래와 같이 사용
def f():
    try:
        x = 1 / 0
    except Exception as e:
        print(e)
        log.error(f'{e} error')

f()