경기도 인공지능 개발 과정/Python

Python 예외처리

agingcurve 2022. 5. 28. 14:57
반응형

학습목표

  1. 예외와 예외처리가 무엇인지 이해한다.
  2. 예외처리 문법 이해하고 활용 할 수 있다.

예외

– 프로그램이 실행되는 동안 발생할 수 있는 비정상적인 조건 – 번역시의 에러가 아닌 실행시의 에러를 예외라 한다.

파이썬에서의 예외 처리

try except 사용하기

  • 예외 처리를 하려면 try에 실행할 코드를 넣고 except 에 예외가 발생했을 때 처리할 코드를 넣는다.
try : 
    실행할 코드 
except:
    예외가 발생했을 때 처리하는 코드
In [4]:
a = int(input())

print(a/3)

print('다음 수행할 일')

print('end!!')
a
------------------------------------------
ValueErrorTraceback (most recent call last)
Input In [4], in <cell line: 1>()
----> 1 a = int(input())
      3 print(a/3)
      5 print('다음 수행할 일')

ValueError: invalid literal for int() with base 10: 'a'
In [8]:
a = input('숫자를 입력하세요.')
try:
    print('try1')
    int_v = int(a)  #형변환을 할때 숫자로된 문자가 아니면 형변환 할 수 없다..  
    print('try2')
except:
    print('except 1')
    int_v = 10
    print('except 2')
    
print(int_v/3)

print('다음 수행할 일')

print('end!!')
숫자를 입력하세요.a
try1
except 1
except 2
3.3333333333333335
다음 수행할 일
end!!

원하는 예외만 처리하기

  • except 구문에 예외 이름을 지정하면 지정된 예외가 발생했을 때만 처리한다.
try:
    실행할코드
except 예외이름:
    예외가 발생했을 때 처리하는 코드
  • 예외의 에러 메시지를 받아 올 수 있다.
  • try: 실행할코드 except 예외이름 as 변수: 예외가 발생했을 때 처리하는 코드 print(변수)
  • 모든 예외의 에러 메시지를 출력하고 싶다면 Exception을 이용한다.
except Exception as e:    
    print('예외가 발생했습니다.', e)

예외계층

In [13]:
list_a = [10,20.30]

index =  int(input('인덱스를 입력하세요.'))

try:
    value = list_a[index]
    print(value)
except:
    print(f"헐ㄷㄷ 숫자 {len(list_a)} 아래로 입력하세용")


print(value)
print('end!!')
인덱스를 입력하세요.6
헐ㄷㄷ 숫자 2 아래로 입력하세용
20.3
end!!
In [27]:
list_a = [10,20,30]

index =  int(input('인덱스를 입력하세요.'))

try:
    value = list_a[index]
    print('index로 나눈값은',list_a[index]/index)
except IndexError:
    print(f"헐ㄷㄷ 숫자 {len(list_a)} 아래로 입력하세용")
except ZeroDivisionError as e:
    print(e)
    print('0으로 나눌 수 없어요..  1로 바꿔서 나눠줄께요~')
    index = 1
    print('index로 나눈값은',list_a[index]/index)

print(value)
print('end!!')
인덱스를 입력하세요.0
division by zero
0으로 나눌 수 없어요..  1로 바꿔서 나눠줄께요~
index로 나눈값은 20.0
10
end!!
In [30]:
list_a = [10,20,30]

index =  int(input('인덱스를 입력하세요.'))

try:
    value = list_a[index]
    print('index로 나눈값은',list_a[index]/index)
except Exception as e:
    print(e)

print(value)
print('end!!')
인덱스를 입력하세요.0
------------------------------------------
ZeroDivisionErrorTraceback (most recent call last)
Input In [30], in <cell line: 5>()
      5 try:
      6     value = list_a[index]
----> 7     print('index로 나눈값은',list_a[index]/index)
      8 except IndexError as e:
      9     print(e)

ZeroDivisionError: division by zero
In [19]:
list_a[4]
------------------------------------------
IndexErrorTraceback (most recent call last)
Input In [19], in <cell line: 1>()
----> 1 list_a[4]

IndexError: list index out of range
In [20]:
20/0
------------------------------------------
ZeroDivisionErrorTraceback (most recent call last)
Input In [20], in <cell line: 1>()
----> 1 20/0

ZeroDivisionError: division by zero

예외가 발생하지 않았을 때 실행하는 else

  • else구문은 예외가 발생하지 않았을 때 실행할 구문을 기술한다.
  • else는 except 바로뒤에 와야한다.
  • except를 생략 할 수는 없다.
  • 예외가 발생하면 else 구문은 실행되지 않는다.
try:
    실행할 코드
except:
    예외가 발생했을 때 처리하는 코드
else:
    예외가 발생하지 않았을 때 실행할 코드
In [32]:
list_a = [10,20,30]

index =  int(input('인덱스를 입력하세요.'))

try:
    value = list_a[index]
    print('index로 나눈값은',list_a[index]/index)
except Exception as e:
    print(e)
else:
    print('예외가 발생하지 않았을때 실행되요!')

print(value)
print('end!!')
인덱스를 입력하세요.0
division by zero
10
end!!
In [ ]:
 

반드시 실행되는 finally블록

  • 모든 코드가 반드시 실행된다는 보장은 없다.
  • 하지만, 예외가 발생했든 발생하지 않았든 예외를 적절히 처리했든 처리하지 못했든 간에 반드시 처리해야하는 코드들이 있다.
  • finally 블록은 언제든지 실행된다.
  • finally는 except와 else를 생략할 수 있다.
try:
    실행할 코드
except:
    예외가 발생했을 때 처리하는 코드
else:
    예외가 발생하지 않았을 때 실행할 코드
finally:
    예외 발생 여부와 상관없이 항상 실행할 코드
In [34]:
list_a = [10,20,30]

index =  int(input('인덱스를 입력하세요.'))

try:
    value = list_a[index]
    print('index로 나눈값은',list_a[index]/index)
except Exception as e:
    print(e)
else:
    print('예외가 발생하지 않았을때 실행되요!')
finally:
    print('반드시 실행되어야 할 코드를 넣어줘요~')
print(value)
print('end!!')

#실행시.. 입력값을 0  ,   5,  2  이렇게 실행하면, 예외가 발생되거나 발생되지 않거나 처리하거나 처리하지 못하거나 finally 블럭은 실행된다.
인덱스를 입력하세요.3
list index out of range
반드시 실행되어야 할 코드를 넣어줘요~
10
end!!
In [36]:
list_a = [10,20,30]

index =  int(input('인덱스를 입력하세요.'))
value = 0
try:
    value = list_a[index]
    print('index로 나눈값은',list_a[index]/index)
except IndexError as e:
    print(e)
except Exception as e:
    print('IndexError를 뺀 나머지 exception은 모두 여기서 처리')
else:
    print('예외가 발생하지 않았을때 실행되요!')
finally:
    print('반드시 실행되어야 할 코드를 넣어줘요~')
    print(value)

    

print('end!!')
인덱스를 입력하세요.0
반드시 실행되어야 할 코드를 넣어줘요~
------------------------------------------
ZeroDivisionErrorTraceback (most recent call last)
Input In [36], in <cell line: 5>()
      5 try:
      6     value = list_a[index]
----> 7     print('index로 나눈값은',list_a[index]/index)
      8 except IndexError as e:
      9     print(e)

ZeroDivisionError: division by zero

사용자가 임의로 예외 발생 시키기

  • python에서 정해놓은 예외 이외에도 사용자의 조건에 맞게 예외를 정의 할 수있다
  • 예외를 발생시킬 때는 raise에 예외를 지정하고, 에러메시지를 넣는다.
  • 에러메시지는 생략 가능하다.

``` raise 예외 ('에러메시지')

In [38]:
try:
    score = int(input('점수를 입력하세요.'))
    
    if(score>100):
        raise Exception('점수는 100점을 넘을 수 없습니다.!!!  당신이 입력한 값 : ',score)
    print(f'당신의 점수는 {score}점 입니다.')
except Exception as e :
    print(e)
    
    
점수를 입력하세요.300
('점수는 100점을 넘을 수 없습니다.!!!  당신이 입력한 값 : ', 300)
In [44]:
def inputScore():
    score = int(input('점수를 입력하세요.'))
    
    if(score>100):
        raise Exception('점수는 100점을 넘을 수 없습니다.!!!  당신이 입력한 값 : ',score)
    print(f'당신의 점수는 {score}점 입니다.')

try:
    inputScore()
except Exception as e :
    print(e)
print('end')
점수를 입력하세요.200
('점수는 100점을 넘을 수 없습니다.!!!  당신이 입력한 값 : ', 200)
end

현재 예외를 다시 발생 시키기

  • try except 에서 처리한 예외를 다시 발생 시킬 수 있다.
  • except 안에서 raise를 사용하면 현재 예외를 다시 발생 시킨다.
In [48]:
def inputScore():
    score = int(input('점수를 입력하세요.'))
    try:
        if(score>100):
            raise Exception('점수는 100점을 넘을 수 없습니다.!!!  당신이 입력한 값 : ',score)
        print(f'당신의 점수는 {score}점 입니다.')
    except Exception as e:
        print('함수가 자체적으로 예외를 처리함.')
        print(e)
        raise
        
# inputScore()        
try:
    inputScore()
except Exception as e :
    print('해당 함수를 호출한 쪽에서 예외를 처리함!!  ')
    print(e)
print('end')
점수를 입력하세요.200
함수가 자체적으로 예외를 처리함.
('점수는 100점을 넘을 수 없습니다.!!!  당신이 입력한 값 : ', 200)
해당 함수를 호출한 쪽에서 예외를 처리함!!  
('점수는 100점을 넘을 수 없습니다.!!!  당신이 입력한 값 : ', 200)
end

raise 예외('에러메시지')

        if x % 3 != 0:
            raise Exception('3의 배수가 아닙니다.')
        print(x)
    except Exception as e:
        print('three_multiple 함수에서 예외가 발생했습니다.', e)
        raise RuntimeError('three_multiple 함수에서 예외가 발생했습니다.')

assert로 예외 발생시키기

  • assert는 지정된 조건식이 거짓일 때 assertionError 예외를 발생 시킨다.
  • 조건식이 참이면 그냥 지나간다.
  • assert 는 보통 나와서는 안되는 조건을 검사할 때 사용한다.
In [53]:
x = int(input('3의 배수를 입력하세요.'))

assert x % 3 == 0, '3의 배수가 아닙니다.'

print(x)
3의 배수를 입력하세요.2
------------------------------------------
AssertionErrorTraceback (most recent call last)
Input In [53], in <cell line: 3>()
      1 x = int(input('3의 배수를 입력하세요.'))
----> 3 assert x % 3 == 0, '3의 배수가 아닙니다.'
      5 print(x)

AssertionError: 3의 배수가 아닙니다.
참고

assert는 디버깅 모드에서만 실행됩니다. 특히 파이썬은 기본적으로 디버깅 모드이며(debug의 값이 True) assert가 실행되지 않게 하려면 python에 -O 옵션을 붙여서 실행합니다(영문 대문자 O). python -O 스크립트파일.py

사용자 정의 예외 만들기

  • 프로그래머가 직접 만든 예외를 사용자 정의 예외라고 한다.
  • 예외를 생성하는 방법은 Exception을 상속받아서 새로운 클래스를 만들면 된다.
  • 그리고, init 메서드에서 기반 클래스의 init 메서드를 호출한다.
  • 기반클래스의 init메서드를 호출할 때 에러메시지를 넣어준다.
class 예외이름(Exception):
    def __init__(self):
        super().__init__('에러메시지')
In [49]:
class MyException(Exception):
    def __init__(self):
        super().__init__('이것은 내가 정의한 예외 객체 입니다!!!!')
        
In [50]:
def inputScore():
    score = int(input('점수를 입력하세요.'))
    try:
        if(score>100):
#             raise Exception('점수는 100점을 넘을 수 없습니다.!!!  당신이 입력한 값 : ',score)
                raise MyException()
        print(f'당신의 점수는 {score}점 입니다.')
    except Exception as e:
        print('함수가 자체적으로 예외를 처리함.')
        print(e)
        raise
        
# inputScore()        
try:
    inputScore()
except Exception as e :
    print('해당 함수를 호출한 쪽에서 예외를 처리함!!  ')
    print(e)
print('end')
점수를 입력하세요.200
함수가 자체적으로 예외를 처리함.
이것은 내가 정의한 예외 객체 입니다!!!!
해당 함수를 호출한 쪽에서 예외를 처리함!!  
이것은 내가 정의한 예외 객체 입니다!!!!
end
 
 

'경기도 인공지능 개발 과정 > Python' 카테고리의 다른 글

Python 파이썬으로 TODOLIST 만들어보기  (0) 2022.05.28
Python pymysql 사용하기  (0) 2022.05.28
Python 클래스와 객체  (0) 2022.05.28
Python 파일 입출력  (0) 2022.05.28
Python 함수, lambda 함수  (0) 2022.05.28