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
'Python > Basic' 카테고리의 다른 글
[파이썬, Python] 인코딩과 디코딩(Encoding & Decoding) - 유니코드(utf-8, utf-16), 아스키 코드(ascii) (0) | 2023.03.14 |
---|---|
[파이썬, Python] 파일의 입력과 출력 - open(), close(), with구문, readline(), readlines() (0) | 2023.03.13 |
[파이썬, Python] 모듈(Module)에 대해 알아보자 🧐 (1) | 2023.03.10 |
[파이썬, Python] 스페셜 메소드(Special Method) (0) | 2023.03.10 |
[파이썬, Python] 상속 - 클래스 상속, 메소드 오버라이딩, 다중 상속 (0) | 2023.03.10 |