본문 바로가기

Python

14. 예외처리

1. 오류의 종류

'''
오류의 종류
    : 문법 오류
    : 에러 코드+에러 메세지가 출력되는 오류
      (NameError, IndexError, ZeroDivisionError
      FileNotFoundError, TypeError, ValueError )
       => 예외처리(try...except...else...finally 명령)  가능 
    : 로직 오류 (내가 잘못짰기 때문에 처음부터 잘 찾아봐야 함.)
   
   
# 오류 코드랑 오류 메세지 확인
ex1) 
print(10/0)  
# ZeroDivisionError: division by zero 

ex2)
data_list = [1,2,3]
print(data_list[0], data_list[100]) 
#IndexError: list index out of range

ex3)
print(apple) 
#NameError: name 'apple' is not defined. Did you mean: 'tuple'?

ex4)
a, b = 10, '백'
print(a-b)
#TypeError: unsupported operand type(s) for -: 'int' and 'str'

ex5)
x = '100gifjdh '
print(int(x)+100)
# ValueError: invalid literal for int() with base 10: '100gifjdh '

'''

 

2. 예외처리의 종류

'''
# 예외처리(Exception)


1) try...except 명령
try :
    명령어 (에러 가능)
except 에러코드 as e:  
    특정 에러코드가 났을때 처리 명령어
    e 는 에러메세지 변수 / 굳이 안써도됨
except Exception as e:
    모든 에러코드가 있을 때 처리 명령

정상 명령어 

2) try...except.else 명령
try :
    명령어 (에러 가능)
except 에러코드 as e:  
    특정 에러코드가 났을때 처리 명령어
    e 는 에러메세지 변수 
except Exception as e:
    모든 에러코드가 있을 때 처리 명령
else :
    정상 명령어 1

정상 명령어 2


3) try..except..else..finally 명령
try :
    명령어 (에러 가능)
except 에러코드 as e:  
    특정 에러코드가 났을때 처리 명령어
    e 는 에러메세지 변수 
except Exception as e:
    모든 에러코드가 있을 때 처리 명령
else :
    정상 명령어 1

finally :
    정상 명령어 2 - 무조건 수행
    (에러 처리 후에도 실행됨)

'''

 

3. try... except 명령

# try ~ except 에러코드 as e ~
# 조건)
# 에러 코드를 미리 알고 있어야 한다.
# e는 에러 메세지
data_list = [ 1, 2, 3]
x, y = 100, 'Hello world'
try :
    print(x/10)
    print(x/0)  #ZeroDivisionError
    print(data_list[3])      #IndexError: list index out of range
except  ZeroDivisionError  as e:
    print(f' 에러 발생 : {e}')
except  IndexError  as e:
    print(f' 에러 발생 : {e}')
print('예외처리 테스트 종료')

# 결과)
# 10.0
#  에러 발생 : division by zero
# 예외처리 테스트 종료


# try ~ Exception 에러코드 as e ~
# 모든 에러코드 => Exception 으로 받기 때문에 에러코드를 몰라도 된다.
# e는 에러 메세지

data_list = [ 1, 2, 3]
x, y = 100, 'Hello world'
try :
    print(x/10)
    print(x/0)  #ZeroDivisionError
    print(data_list[3])      #IndexError: list index out of range
except  Exception  as e:
    print(f' 에러 발생 : {e}')
print('예외처리 테스트 종료!!!')


# 반복문안에 예외처리 구문이 있는 경우
# NumList 에서 숫자 데이터만 추출한 후 절대값함수(abs())를 이용해서
# 양수로 구성된 리스트 생성
numList = [-42, '21', '십오', 39, -66, '구십삼', -38, 15, 18, 63]
resultList = []
for item in numList:
    try:
        resultList.append(abs(item))
    
    except Exception : #Exception 생략가능
        pass # 오류 무시
print(resultList)

결과)
[42, 39, 66, 38, 15, 18, 63]

 

4. try... except... else ... finally

# try..except..else..finally...
# 함수 내부에 예외처리가 있는 경우
def divide_test( x,y ):
    try:
        result = x/y              

        
    except Exception as e:
        print(f'에러 발생 => {e}')
        
    else:
        print(f'{x}/{y} = {result}')
        
    finally:
        print('divide_test함수가 호출되었습니다....\n')
        

divide_test( 100,5 )
divide_test( 100,0 )
divide_test( '백', 4 )

# 결과)
# 100/5 = 20.0
# divide_test함수가 호출되었습니다....

# 에러 발생 => division by zero
# divide_test함수가 호출되었습니다....

# 에러 발생 => unsupported operand type(s) for /: 'str' and 'int'        
# divide_test함수가 호출되었습니다....



# 예외처리 안에 함수가 있는 경우
try:
    divide_test()
except:
    pass

# pass 해서 아무것도 안나옴.


# Quiz


입력된 글자가 숫자가 아니라면 에러 메세지 출력, 입력된 글자가 모두 숫자라면
두 수를 더한 후 출력한다.


def add_except():
    try:
        # 입력 데이터
        data1 = float(input('숫자1 입력?....'))
        data2 = float(input('숫자2 입력?....'))
    
    except:
        print('입력 데이터가 숫자가 아닙니다.')
    else:
        print(f'{data1}+{data2} = {data1+data2}')
    
    finally:
        print('divide_test 함수가 호출되었습니다....\n')        
    
    
add_except()
add_except()
add_except()

결과)
숫자1 입력?....김
입력 데이터가 숫자가 아닙니다.
divide_test 함수가 호출되었습니다....

숫자1 입력?....100
숫자2 입력?....200
100.0+200.0 = 300.0
divide_test 함수가 호출되었습니다....

숫자1 입력?....50 
숫자2 입력?....-20
50.0+-20.0 = 30.0
divide_test 함수가 호출되었습니다....


'