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 |