1. 예외
예외(Exception)는 프로그램 실행 중 발생할 수 있는 예상치 못한 문제 또는 오류 상황을 의미합니다. 예외가 발생하면 프로그램은 중단되기 때문에 이를 적절하게 처리하여 중단을 방지하거나 오류에 대한 정보를 사용자에게 제공해야 합니다.
서비스중 에러로 인해 프로그램이 비정상적으로 종료되는 상황을 예방할수있다.
print(10 / 3)
# print(5 / 0) # ZeroDivisionError: division by zero
print(4 / 2)
3.3333333333333335
2.0
2. 예외처리 기본구조
try:
# 예외가 발생할 가능성이 있는 코드
except ExceptionType1: # 'ExceptionType1'에는 실제 예외 유형이 들어갑니다.
# ExceptionType1 예외가 발생했을 때 실행될 코드
except ExceptionType2: # 'ExceptionType2'에는 다른 예외 유형이 들어갑니다.
# ExceptionType2 예외가 발생했을 때 실행될 코드
# 추가적인 except 블록을 계속 추가할 수 있습니다.
else:
# try 블록에서 예외가 발생하지 않았을 때 실행될 코드
finally:
# 예외 발생 여부와 관계없이 항상 실행될 코드
try:
print(10 / 3)
print(5 / 0)
print(4 / 2)
except ZeroDivisionError: # 해당 에러가 발생할 경우 실행.
print('0으로 나눌 수 없습니다.')
print('프로그램을 종료합니다.')
3.3333333333333335
0으로 나눌 수 없습니다.
프로그램을 종료합니다.
try:
print(10 / 3)
print(5 / 0)
print(4 / 2)
except: # except 뒤에 값을 안써도 사용이 가능하다.
print('0으로 나눌 수 없습니다.')
print('프로그램을 종료합니다.')
except 에 아무 값도 않넣으면 except 라는 클래스 의 객체에서 오류를 처리해주지만 정확한 에러의 유형을 알기 힘들다는 단점이 있다.
data = [10, 20, 30, 40, 50]
print(data[5])
IndexError: list index out of range
try:
data = [10, 20, 30, 40, 50]
print(data[0]) # 실행
print(data[5]) # 에러
print(data[3]) # 실행 X
except IndexError:
print('인덱스 지정이 올바르지 않습니다')
print('프로그램을 종료합니다')
10
인덱스 지정이 올바르지 않습니다
프로그램을 종료합니다
try:
data = [10, 20, 30, 40, 50]
print(data[0])
print(int('일')) # ValueError 에러
print(5 / 0) # ZeroDivisionError에러
print(data[5]) # IndexError에러
print(data[3])
except IndexError:
print('인덱스 범위를 벗어났습니다')
except ZeroDivisionError:
print('0으로 나눌수 없습니다')
except :
print('오류를 모두 처리 했습니다')
print('프로그램을 종료합니다')
10
오류를 모두 처리 했습니다
프로그램을 종료합니다
일부 오류를 따로 처리 후 다른 에러들을 일괄처리 하려면 맨 마지막줄에서 처리를 해야 한다.
try:
data = [10, 20, 30, 40, 50]
print(data[0])
# print(int('일')) # 에러
# print(5 / 0) # ZeroDivisionError에러
print(data[5]) # IndexError에러
print(data[3])
except IndexError as e: # 에러 메세지를 e 에 담아준다
print(e)
except ZeroDivisionError as e:
print(e)
except Exception as e:
print(e)
print('프로그램을 종료합니다')
10
문자열을 정수로 변환했습니다
프로그램을 종료합니다
try:
data = [10, 20, 30, 40, 50]
print(data[0])
print(data[5])
print(data[3])
except IndexError as e:
print(e)
except ZeroDivisionError as e:
print(e)
except Exception as e:
print(e)
else: # 오류가 없으면 실행되는 코드
print('정상적인 프로그램 진행')
finally: # 오류에 관계없이 무조건 실행되는 코드
print('오류에 관계없이 무조건 실행되는 문장')
print('프로그램을 종료합니다')
10
list index out of range
오류에 관계없이 무조건 실행되는 문장
프로그램을 종료합니다
except 에러 as 변수 를 통해 발생한 에러 메세지를 변수에 담아 확인 해 볼수있다.
3. Exception 클래스
Exception 클래스는 파이썬의 내장 예외 계층 구조에서 거의 모든 내장 예외의 기본 클래스입니다. 이 클래스는 사용자 정의 예외를 만들거나 특정 예외 유형을 잡기 위한 기본적인 인터페이스를 제공합니다.
try:
# 에러를 직접 발생
raise Exception('에러를 발생했어요')
except Exception as e:
print(e)
에러를 발생했어요
강제로 에러를 발생시켜줄수있다.
파이썬은 인식을 못하지만 실제로는 에러인 경우 직접 에러를 발생시켜 막을수있다.
ex) 나이를 정수로 입력받는 프로그램 이지만 -100도 정수 이기때문에 에러가 나지 않는다. 이런 경우에 직접 에러를 발생시킬수있다.
def func1():
n = int(input('짝수를 입력하세요: '))
if n % 2 != 0:
raise Exception('짝수가 아닙니다') # 홀수 일 경우 에러를 발생 시켜준다.
print(n)
try:
func1()
except Exception as e:
print('예외가 발생: ',e)
짝수를 입력하세요: 1
예외가 발생: 짝수가 아닙니다
def func1():
# try:
# func2()
# except TypeError:
# print('타입이 올바르지 않습니다')
func2()
def func2():
# try:
# func3()
# except TypeError:
# print('타입이 올바르지 않습니다')
func3()
def func3():
# try:
# print('%d'%'문자열')
# except TypeError:
# print('타입이 올바르지 않습니다')
print('%d'%'문자열') # TypeError
# try:
# func1()
# except TypeError:
# print('타입이 올바르지 않습니다')
func1()
타입이 올바르지 않습니다
부모클래스에 에러가 발생했을때 자식 클래스,객체 어디서든 예외처리를 할수있다.
4. 사용자 정의 예외 클래스를 직접 만들고 활용하기
class AgeLimitError(Exception):
def __init__(self, age, message='원하는 나이 범위가 아님'):
self.age = age
self.message = message
super().__init__(message)# Exception 메세지
Exception 클래스를 상속받고 에러 메세지를 Exception 생성자에 전달 해준다.
def check_age(age):
if age < 20:
raise AgeLimitError(age, '나이 범위보다 어림')
elif age > 50:
raise AgeLimitError(age, '나이 범위보다 큼')
else:
return '나이 범위안에 포함'
ages = [17, 60, 25, 46, 20, 52, 26]
for age in ages:
try:
print(check_age(age))
except AgeLimitError as e:
print(f'Error for age {e.age}: {e}')
Error for age 17: 나이 범위보다 어림
Error for age 60: 나이 범위보다 큼
나이 범위안에 포함
나이 범위안에 포함
나이 범위안에 포함
Error for age 52: 나이 범위보다 큼
나이 범위안에 포함