본문 바로가기

Python

21. 예외 처리

1. 예외 처리

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

1-1. try except 사용하기

try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...
except:
  오류가 발생했을 경우 실행할 문장
  ...
print(10 / 3)
# 0으로 나눌 수 없기 때문에 오류 발생
# print(5 / 0) # ZeroDivisionError: division by zero
print(4 / 2)
try:
  print(10 / 3)
  print(5 / 0) # 오류 발생
  print(4 / 2) # 문장이 실행되지 않음
except: # except는 모든 오류를 처리
  print('0으로 나눌 수 없습니다.')
print('프로그램을 종료합니다.')

'''
3.3333333333333335
0으로 나눌 수 없습니다.
프로그램을 종료합니다.
'''
data = [10, 20, 30, 40, 50]
# 5번 인덱스가 없으므로 오류 발생
# print(data[5]) # IndexError: list index out of range

try:
  data = [10, 20, 30, 40, 50]
  print(data[0])
  print(data[1])
  print(data[5])
  print(data[3])
except:
  print('인덱스 지정이 올바르지 않습니다.')
print('프로그램을 종료합니다.')

'''
10
20
인덱스 지정이 올바르지 않습니다.
프로그램을 종료합니다.
'''

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

try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...
except 예외 클래스명:
  오류가 발생했을 경우 실행할 문장
  ...
try:
  print(10 / 3)
  print(5 / 0) # ZeroDivisionError 오류 발생
  print(4 / 2)
except IndexError: # 오류 클래스가 다르므로 except 블록에서 처리가 안됨
  print('0으로 나눌 수 없습니다.')
print('프로그램을 종료합니다.')

# 3.3333333333333335
try:
  print(10 / 3)
  print(5 / 0) # ZeroDivisionError
  print(4 / 2)
except ZeroDivisionError: # 예외 클래스가 같으므로, except 블록에서 처리
  print('0으로 나눌 수 없습니다.')
print('프로그램을 종료합니다.')

'''
3.3333333333333335
0으로 나눌 수 없습니다.
프로그램을 종료합니다.
'''

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

try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...
except 예외 클래스명 as 변수:
  오류가 발생했을 경우 실행할 문장
  ...
try:
  data = [10, 20, 30, 40, 50]
  print(10 / 3)
  # print(5 / 0) # 주석을 풀면 
  '''
  3.3333333333333335
  0으로 나눌 수 없습니다. division by zero 
  프로그램을 종료합니다.
  '''
  print(4 / 2)
  print(data[5])
except ZeroDivisionError as e:
  print('0으로 나눌 수 없습니다.', e)
except IndexError as e:
  print('인덱스 지정이 올바르지 않습니다.', e)
print('프로그램을 종료합니다.')

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

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

try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...
except 예외 클래스명 as 변수:
  오류가 발생했을 경우 실행할 문장
  ...
else:
  오류가 발생하지 않았을 경우 실행할 문장
try:
  data = [10, 20, 30, 40, 50]
  string = '오늘은 즐거운 예외처리 시간!'
  print(10 / 3)
  # print(5 / 0)
  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('프로그램을 종료합니다.')

'''
3.3333333333333335
2.0
정상적인 프로그램 진행
프로그램을 종료합니다.
'''

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

try:
  오류가 발생할 것으로 예상되는 문장
  ...
  ...
except 예외 클래스명 as 변수:
  오류가 발생했을 경우 실행할 문장
  ...
else:
  오류가 발생하지 않았을 경우 실행할 문장
finally:
  예외 발생 여부와 관계없이 항상 실행할 문장
try:
  data = [10, 20, 30, 40, 50]
  string = '오늘은 즐거운 예외처리 시간!'
  print(10 / 3)
  # print(5 / 0)
  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('프로그램을 종료합니다.')

'''
3.3333333333333335
2.0
정상적인 프로그램 진행
오류에 관계없이 무조건 실행되는 문장
프로그램을 종료합니다.
'''
try:
  data = [10, 20, 30, 40, 50]
  string = '오늘은 즐거운 예외처리 시간!'
  print(10 / 3)
  # print(5 / 0)
  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('프로그램을 종료합니다.')

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

문제

데이터를 입력하면 오름차순 정렬하여 출력하는 프로그램을 작성해보자.(단, 숫자를 문자를 섞어 입력하면 숫자+문자 형식으로 정렬, 000을 입력하면 정렬을 시작함)

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

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


data = 0;
li1 = []
li2 = []
result = []
while True:
  data = input('데이터를 입력하세요 : ')
    
  if data == '000':
    break
  try:
    li1.append(int(data))
  except ValueError:
    li2.append(data)

li1.sort()
li2.sort()

for i in li1:
  result.append(i)
for i in li2:
  result.append(i)

print(f'결과{result}')

'''
데이터를 입력하세요 : abc
데이터를 입력하세요 : 123
데이터를 입력하세요 : 1
데이터를 입력하세요 : bbb
데이터를 입력하세요 : 000
결과[1, 123, 'abc', 'bbb']
'''

2. 예외 발생 시키기

try:
  n = int(input('짝수를 입력하세요 : '))
  if n % 2 != 0:
    raise Exception('짝수가 아닙니다!') # 예외를 발생시킴
  print(n)
except Exception as e:
  print('예외가 발생했습니다', e)
  
# 짝수를 입력하세요 : 3
# 예외가 발생했습니다 짝수가 아닙니다!
def func1():
  n = int(input('짝수를 입력하세요 : '))
  if n % 2 != 0:
    raise Exception('짝수가 아닙니다!')
  print(n)

try:
  func1()
except Exception as e:
  print('예외가 발생했습니다.', e)
  
# 짝수를 입력하세요 : 5
# 예외가 발생했습니다. 짝수가 아닙니다!
def func1():
  func2()

def func2():
  func3()

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

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

def func2():
  func3()

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

func1()

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

'Python' 카테고리의 다른 글

23. 클로저와 데코레이터  (0) 2023.03.14
22. 파일 입출력  (0) 2023.03.14
20. 모듈  (0) 2023.03.13
19. 스페셜 메소드  (0) 2023.03.10
18. 상속  (0) 2023.03.10