본문 바로가기
Python/Basic

[파이썬, Python] 예외 처리에 대해 알아보자 🧐

by coding-choonsik 2023. 3. 13.
728x90
반응형
SMALL

1. 예외처리란❓

예외란?

코드를 실행하는 중에 발생한 에러(Error)

  • 오류가 발생되었을 때 별도의 처리를 하거나 무시하고 프로그램을 실행하는 것
  • 오류가 발생될 것으로 예상되는 문장을 try 블록에 코딩하고, try 블록에 코딩된 내용을 실행하다가 오류가 발생하면 더이상 try 블록의 내용을 실행하지 않고 해당 오류의 except 블록에 코딩된 내용을 실행
  • 파이썬은 발생할 수 있는 모든 문제를 예외 클래스로 만들어 놓음

 

1-1. try except 사용하기

try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...

except:
  오류가 발생했을 경우 실행할 문장
  ...
  ...

  • 5 / 0 연산에 대한 에러로 뒤에 코딩된 문장은 실행되지 않는다.
print(10/4)
print(5/0)   # 에러
print(4/2)

>>> 2.5
ZeroDivisionError: division by zero

  • 예외처리문으로 작성해보자.
try:
  print(10/4)
  print(5/0)    
  print(4/2)

except:
  print('0으로 나눌 수 없습니다!')

print('프로그램을 종료합니다')

>>> 2.5
0으로 나눌 수 없습니다!
프로그램을 종료합니다
  • 내용을 실행하다가 오류가 발생한 부분에서 except에 코딩된 내용을 실행함.

data = [10, 20, 30, 40, 50]   # 인덱스 0 ~ 4번
print(data[5])      

>>> IndexError: list index out of range

 

  • 예외처리문으로 작성해보자.
try:
  data = [10, 20, 30, 40, 50]
  print(data[0])
  print(data[3])
  print(data[5]) 

except:
  print('인덱스 지정이 올바르지 않습니다')
print('프로그램을 종료합니다')

>>> 10
40
인덱스 지정이 올바르지 않습니다
프로그램을 종료합니다
  • 인덱스 에러가 발생하기 전까지는 실행되고 에러가 발생한 부분은 except에 작성된 내용이 실행된다.

1-2. 특정 예외만 처리하기

try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...

except 예외이름:
  오류가 발생했을 경우 실행할 문장
  ...
  ...

try:
  print(10/4)
  print(5/0)    
  print(4/2)

except ZeroDivisionError:
  print('0으로 나눌 수 없습니다!')

print('프로그램을 종료합니다')

>>> 2.5
0으로 나눌 수 없습니다!
프로그램을 종료합니다

# 다른 에러 입력시 예외처리 불가
try:
  print(10/4)
  print(5/0)    
  print(4/2)

except IndexError:   
  print('0으로 나눌 수 없습니다!')

print('프로그램을 종료합니다')

>>> 
ZeroDivisionError: division by zero

  • except에 입력된 에러가 발생하지 않을 때 except문은 처리되지 않음
try:
  print(10/4)
  print(4/2)

except ZeroDivisionError:            # 오류 없을 시 처리되지 않음
  print('0으로 나눌 수 없습니다!')

print('프로그램을 종료합니다')

>>> 2.5
2.0

  • 특정 예외가 여러개 일 때
try:
  data = [10, 20, 30, 40, 50]
  print(10/4)  
  print(4/2)
  print(data[5])

except ZeroDivisionError:               # 오류가 발생하는 문장이 없음
  print('0으로 나눌 수 없습니다!')

except IndexError:
  print('인덱스 지정이 올바르지 않습니다')
  
print('프로그램을 종료합니다')

>>> 2.5
2.0
인덱스 지정이 올바르지 않습니다
프로그램을 종료합니다

1-3. 예외 에러 메세지 받기

try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...

except 예외이름 as 변수:
  오류가 발생했을 경우 실행할 문장
  ...
  ...

  • 예외이름을 저장할 변수 e
  • 예외이름(에러의 이유)를 알 수 있다.
try:
  data = [10, 20, 30, 40, 50]
  print(10/4)  
  print(4/2)
  print(data[5])

except ZeroDivisionError as e:              
  print('0으로 나눌 수 없습니다!', e)

except IndexError as e:
  print('인덱스 지정이 올바르지 않습니다', e)
  
print('프로그램을 종료합니다')

1-4. 예외가 발생하지 않았을 경우 처리하기

try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...

except 예외이름 as 변수:
  오류가 발생했을 경우 실행할 문장
  ...
  ...

else:
  오류가 발생하지 않았을 경우 실행할 문장

try:
  data = [10, 20, 30, 40, 50]
  string = '오늘은 즐거운 예외처리 시간!'
  print(10/4)  
  print(4/2)
  print(data[5])    # 오류 발생 지점
  print('%d' % string)

except ZeroDivisionError as e:              
  print('0으로 나눌 수 없습니다!', e)

except IndexError as e:
  print('인덱스 지정이 올바르지 않습니다', e)

except TypeError as e:
  print('데이터 타입이 올바르지 않습니다', e)

else:    
  print('정상적인 프로그램 진행')
  
print('프로그램을 종료합니다')

>>> 2.5
2.0
인덱스 지정이 올바르지 않습니다 list index out of range
프로그램을 종료합니다

 

위 코드 결과에 대한 실행 순서


1-5. 예외와 관계없이 코드 실행하기

try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...

except 예외이름 as 변수:
  오류가 발생했을 경우 실행할 문장
  ...
  ...

else:
  오류가 발생하지 않았을 경우 실행할 문장
  ...

finally:    # 옵션
  예외 발생 여부와 관계없이 항상 실행할 문장
  ...

try:
  data = [10, 20, 30, 40, 50]
  string = '오늘은 즐거운 예외처리 시간!'
  print(10/4)  
  print(4/2)
  # print(data[5])
  print('%d' % string)

except ZeroDivisionError as e:              
  print('0으로 나눌 수 없습니다!', e)

except IndexError as e:
  print('인덱스 지정이 올바르지 않습니다', e)

except TypeError as e:
  print('데이터 타입이 올바르지 않습니다', e)

else:   
  print('정상적인 프로그램 진행')
  
finally:       
  print('오류에 관계없이 무조건 실행되는 문장')

print('프로그램을 종료합니다')


>>> 2.5
2.0
데이터 타입이 올바르지 않습니다 %d format: a number is required, not str
오류에 관계없이 무조건 실행되는 문장
프로그램을 종료합니다

 

위 코드 결과에 대한 실행 순서

 

 

📍 try, except, else, finally의 실행 과정


문제

데이터를 입력하면 오름차순 정렬하여 출력하는 프로그램을 작성해보자.

(단, 숫자와 문자를 섞어 입력하여 숫자+문자 형식으로 정렬함, 000 을 입력하면 정렬을 시작함 )

  • 데이터를 입력하세요: abc
  • 데이터를 입력하세요: 123
  • 데이터를 입력하세요: 1
  • 데이터를 입력하세요: bbb
  • 데이터를 입력하세요: 000

결과 [1, 123, 'abc', 'bbb']

 

num_list = []
str_list = []

while True:
  data = input('데이터를 입력하세요: ')
  if data == '000':
    break
  try:
    num_list.append(int(data))  # str 타입  저장시 오류!
  
  except:
    str_list.append(data)
  
num_list.sort()
str_list.sort()
print(num_list + str_list)   # 결합
 
>>> 데이터를 입력하세요: 123
데이터를 입력하세요: 56
데이터를 입력하세요: abc
데이터를 입력하세요: y
데이터를 입력하세요: 415
데이터를 입력하세요: 000
[56, 123, 415, 'abc', 'y']

2. 예외 발생시키기

  • raise 예외('에러메시지')
try:
  n = int(input('짝수를 입력하세요: '))
  if n % 2 != 0:
    raise Exception('짝수가 아닙니다')   # 예외를 발생시킴
  print(n)

except Exception as e:
  print('예외가 발생했습니다', e)
  
# 짝수 입력시 
>>> 짝수를 입력하세요: 4
4

# 홀수 입력시
>>> 짝수를 입력하세요: 7
예외가 발생했습니다 짝수가 아닙니다

2-1. 함수 호출과 예외 발생

def func1():
  n = int(input('짝수를 입력하세요: '))
  if n % 2 != 0:
    raise Exception('짝수가 아닙니다')   
  print(n)

try:
  func1()   # 함수 호출

except Exception as e:
  print('예외가 발생했습니다', e)
  
# 짝수 입력시
>>> 짝수를 입력하세요: 4
4

# 홀수 입력시
>>> 짝수를 입력하세요: 5
예외가 발생했습니다 짝수가 아닙니다

 


  • try except 사용하지 않을 경우 Error!
def func1():
  n = int(input('짝수를 입력하세요: '))
  if n % 2 != 0:
    raise Exception('짝수가 아닙니다')   
  print(n)


func1()
print('프로그램을 종료합니다')

>>> 짝수를 입력하세요: 5
Exception: 짝수가 아닙니다

def func1():
  func2() 

def func2():
  func3()

def func3():
  try:
    print('%d' %'문자열 출력')   
  except TypeError:
    print('타입이 올바르지 않습니다!')

func1()

>>> 타입이 올바르지 않습니다!


def func1():
  try:
    func2() 
  except TypeError:
    print('타입이 올바르지 않습니다!')

def func2():
  func3()

def func3():
  print('%d' %'문자열 출력')   # 오류

func1()

>>> 타입이 올바르지 않습니다!

 

 

 

728x90
반응형
LIST