본문 바로가기

프로그래밍/Python

[요약] 파이썬(Python) - 예외처리(Exception)

[요약] 파이썬(Python) - 예외처리(Exception)


발생 가능한 예외의 종류

문법적 오류 (SyntaxError): 

통합 IDE를 사용한다면 linter가 Detect해 줌

linter : 문법 코드 스타일, 문법 체크, microsoft Code 자체가 Python의 linter 역할을 함(문법 체크)


런타임 오류(RuntimeError) :

NameError : 참조변수 에러

ZeroDivisionError : 0 나누기 에러

IndexError : 인덱스 범위를 벗어남

    • IndexError: list index out of range

KeyError: 'hobby'

AttributeError : 모듈, 클래스에 있는 잘못된 속성 호출시

    • AttributeError: module 'time' has no attribute 'month'

ValueError : 참조값이 없는 경우 

    • ValueError: list.remove(x): x not in list

FileNotFoundError : 지정된 파일을 찾지 못하는 경우

    • FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

TypeError : 형변환 에러

    • TypeError: can only concatenate list (not "tuple") to list


예외처리 구문

try # 에러가 발생할 가능성이 있는 코드 실행

except ZeroDivisionError

except IndexError : 

except : 기타 오류 발생시 캐치

else  : 예외가 발생하지 않았을 경우 실행

finally : 예외가 발생하던 안하던 항상 실행


예외처리 사례 코드)


# 파이썬(Python) 예외처리

# 예외 종류
# 문법적으로는 오류가 없지만 코드 실행(런타임)시에 프로세스에서 발생하는 예외 처리가 중요함
# linter : 문법 코드 스타일, 문법 체크, microsoft Code 자체가 Python의 linter 역할을 함(문법 체크)
# 

# SyntaxError : 잘못된 문법

# 예)
print('Test)
if True
   pass

 x => y    # NameError : 참조변수 에러
 a = 10
 b = 20
 print(c)   # --> NameError 발생


# ZeroDivisionError : 0 나누기 에러
print(10 / 0)

# IndexError : 인덱스 범위를 벗어남

x = [10, 20, 30]
print(x[0])     # 정상
print(x[3])     # IndexError: list index out of range

# KeyError
dic = {'name' : 'Kim', 'Age' : 33, 'City' : 'Seoul'}
print(dic['hobby'])       # KeyError: 'hobby'
print(dic.get('hobby'))   # None

# AttributeError : 모듈, 클래스에 있는 잘못된 속성 호출시
import time
print(time.time())
print(time.month()) # AttributeError: module 'time' has no attribute 'month'

# ValueError : 참조값이 없는 경우
x = [1,5, 9]
x.remove(10)      # ValueError: list.remove(x): x not in list
x.index(10)       # ValueError: 10 is not in list

# FileNotFoundError
f = open('test.txt', 'r')   # FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'

# TypeError
x = [1, 2]
y = (1, 2)
z = 'test'

print(x+y)  # TypeError: can only concatenate list (not "tuple") to list
print (x + list(y)) # 정상 - 형변환에 의한,  [1, 2, 1, 2]

# 예외가 발생하지 않을거라 가정하고 코딩 후
# 런타임 예외 발생가능한 부분에 대한 예외 처리 코딩 추가(EAFP 코딩 스타일)
# EAFP : 일단 만들고 오류 발생 가능한 부분에 예외 처리를 하는 방식의 코딩


# 예외처리 기본
# try : 에러가 발생할 가능성이 있는 코드 실행
# except : 에러1이 발생할 경우 캐치
# except : 에러2가 발생할 경우 캐치
# else  : 에러가 발생하지 않았을 경우 실행
# finally : 항상 실행

#예1)
name = ['Kim', 'Park', 'Choi']

try:
    z = 'Lee'
    x = name.index(z)

    print('{} found it! in name'. format(z, x+1))
except ValueError: # 캐치할 에러 지정 (AttributeError, ZeroDivisionError, NameError ... )
    print('not found it! - Occured ValueError')
else:
    print('OK! else!')

# except: 또는 except Exception: 로 두면 모든 오류를 캐치하게됨.


#예2)
try:
    z = 'Lee'
    x = name.index(z)
    print('{} found it! in name'. format(z, x+1))
except:
    print('not found it! - Error')
else:
    print('OK! else!')
finally:
    print('finally OK!')

# 예3)
# 예외처리는 하지 않지만, 무조건 수행되는 코딩 패턴

try:
    print('Try')
finally:
    print('OK finally')

# 예제4)    
try:
    z = 'Lee'
    x = name.index(z)
    print('{} found it! in name'. format(z, x+1))
except ValueError:
    print('Occured ValueError')
except NameError :
    print('Occured NameError')
except IndexError:
    print('Occured IndexError')
except Exception:
    print('Occured Other...')
else:
    print('OK else')
finally:
    print('finally OK!')


# 예5)
# 강제 예외발생 raise
# raise 키워드로 예외 직접 발생

try:
    a = 'Kim'
    if a=='Lee':
        print('Ok 허가')
    else:
        raise ValueError
except ValueError:
    print('문제발생')
except Exception  as f:
    print(f)
else:   
    print('OK!')