20. 예외 처리

2024. 9. 30. 22:55파이썬(python)

 

1. 예외(Excpetion)

* 예외(Exception)는 프로그램 실행 중 발생할 수 있는 예상치 못한 문제 또는 오류 상황을 의미합니다. 
* 예외가 발생하면 프로그램은 중단되기 때문에 이를 적절하게 처리하여 중단을 방지하거나 오류에 대한 정보를 사용자에게 제공해야 합니다.


1)
print(10 / 3)
#print(5 / 0) #예외 발생시 다음 print문 실행안됨 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:
    # 예외 발생 여부와 관계없이 항상 실행될 코드
    
    
*1. 모든 예외 처리하기
1)
try:
  print(10 / 3)
  print(5 / 0) # 예외 발생시 다음 print문 실행안됨
  print(4 / 2)
except ZeroDivisionError:
  print('예외가 발생했어요')
print('프로그램을 종료합니다.')
-->
3.3333333333333335
예외가 발생했어요
프로그램을 종료합니다.


2)
data = [10,20,30,40,50]
print(data[0])
print(data[1])
print(data[2])

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


2. 특정 예외 처리하기
1)
try:
  data = [10.20,30,40,50]
  print(5/0)
except IndexError:
  print('인덱스 지정이 올바르지 않습니다.')
except ValueError:
  print('값이 잘못 입력되었습니다.')
except ZeroDivisionError:
  print('0으로 나눌수 없습니다.')
print('프로그램을 종료합니다.')
-->
0으로 나눌수 없습니다.
프로그램을 종료합니다.


2)
try:
  data = [10,20,30,40,50]
  print(int('안녕'))
except IndexError as e:
  print(e)
except ValueError as e:
  print(e)
except ZeroDivisionError as e:
  print(e)
except Exception:
  print('예외가 발생했어요')
print('프로그램을 종료합니다.')
-->
invalid literal for int() with base 10: '안녕'
프로그램을 종료합니다.


3)
try:
  data = [10,20,30,40,50]
  print(int('안녕'))
except IndexError as e:
  print(e)
except ValueError as e:
  print(e)
except ZeroDivisionError as e:
  print(e)
except Exception as e:
  print(e)
else:
  print('에러가 발생하지 않은 정상적인 프로그램')
finally:
  print('에러에 관계없이 무조건 실행되는 문장')
print('프로그램을 종료합니다.')
-->
invalid literal for int() with base 10: '안녕'
에러에 관계없이 무조건 실행되는 문장
프로그램을 종료합니다.


3.Exception 클래스
Exception 클래스는 파이썬의 내장 예외 계층 구조에서 거의 모든 내장 예외의 기본 클래스입니다. 이 클래스는 사용자 정의 예외를 만들거나 특정 예외 유형을 잡기 위한 기본적인 인터페이스를 제공합니다.


구성)
try:
    raise Exception("Custom error message.")
except Exception as e:
    print(e.args)       # ('Custom error message.',)
    print(str(e))       # Custom error message.
    
    
1)
#예외 상황을 발생시킴
try:
  raise Exception('예외가 발생했어요!')
except Exception as e:
  print(e)
-->
예외가 발생했어요!


2)
def func1():
    n = int(int(input('짝수를 입력하세요:')))
    if n % 2 == 1:
      raise Exception('홀수를 입력했어요')
    print(n)
try:
    func1()
except Exception as e:
    print('예외가 발생했습니다.', e)
-->
짝수를 입력하세요:1
예외가 발생했습니다. 홀수를 입력했어요


3)
try:
  func1()
except Exception as e:
  print('예외가 발생 : ', e)
-->
짝수를 입력하세요:1
예외가 발생 :  홀수를 입력했어요


4)
def func2():
    func2()

def func2():
    func3()

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


5)
# #문제2
# * 사용자 정의 예외 클래스를 직접 만들고 활용해보자
# * 아래 클래스의 함수의 내용을 채우기
# * 단, 나이의 범위는 아래와 같다.
# * MZ 세대 : 14 ~ 43살
# * X 세대 : 44살 ~
# * 알파세대 : ~ 13살

# '''
# 17 나이 : 나이 범위 안에 포함
# 60 나이 에러 : MZ 나이 범위 보다 큼
# 5 나이 에러 : MZ 나이 범위보다 작음
# '''

# 5)
class AgeLimitError(Exception):
    def __init__(self, age, message='MZ세대 나이의 범위가 아님'):
        self.age = age
        self.message = message
        super().__init__(self.message) #Exception('메시지')

def check_age(age):
    pass

ages = [17, 60, 46, 55, 26, 12, 5]

for age in ages:
    pass

    def check_age(age):
        if age < 14:
            raise AgeLimitError(age, 'MZ 나이범위보다 작음')
        elif age > 43:
            raise AgeLimitError(age, 'MZ 나이 범위보다 큼')
        else:
            return f'{age} 나이 : MZ 나이 범위안에 포함'
        
for age in ages:
    pass


    try:
        print(check_age(age))
    except AgeLimitError as e:
        print(f'{e.age} 나이 에러: {e}')
-->
17 나이 : MZ 나이 범위안에 포함
60 나이 에러: MZ 나이 범위보다 큼
46 나이 에러: MZ 나이 범위보다 큼
55 나이 에러: MZ 나이 범위보다 큼
26 나이 : MZ 나이 범위안에 포함
12 나이 에러: MZ 나이범위보다 작음
5 나이 에러: MZ 나이범위보다 작음

 

 

728x90
LIST

'파이썬(python)' 카테고리의 다른 글

22. 파일 입출력  (0) 2024.10.02
21. 파이썬 모듈  (0) 2024.10.02
19. 스페셜 메서드  (0) 2024.09.30
18. 파이썬의 상속  (2) 2024.09.30
17. 클로저  (2) 2024.09.30