본문 바로가기
인공지능/파이썬 기초

파이썬의 예외 처리

by hyunji00pj 2024. 10. 1.

KDT_4기 파이썬 기초 0930(2)

2024.09.30 수업 내용 복습일기 두번째

 

오늘은 예외처리에 대해 알아보자

 

 

1. 예외(Exception)

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

print(10/3)
print(5/0)#ZeroDivisionError: division by zero
print(4/2)

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('예외 발생')
print('프로그램을 종료합니다')

try:
    print(10 / 3)
    print(5 / 0)
    print(4 / 2)
except:#이름을 쓰지 않아도 전달은 됨
    print('예외 발생')
print('프로그램을 종료합니다')

문제1

  • 아래와 같이 데이터가 있을 때 인덱싱 오류가 발생할 경우 "인덱스 지정이 올바르지 않습니다" 라는 메세지를 출력해보자
  • data = [10,20,30,40,50]
  • 오류발생 코드: print(data[5])
  • 단 해당 에러 클래스를 사용
data = [10,20,30,40,50]
print(data[0])
print(data[1])
print(data[-1])
print(data[5])

 

문제 풀이

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

다른 예외 처리

try:
  data = [10,20,30,40,50]
  #print(data[5])
  #print(int('안녕'))
  print(5/0)

except IndexError:
  print("인덱스 지정이 올바르지 않습니다.")
except ValueError:
  print("값이 잘못입력되었습니다.")
except ZeroDivisionError:
  print("0으로 나눌 수 없습니다.")
except:#전체 except는 항상 맨 밑에다가 해주어야함
  print("예외가 발생했습니다.")
print("프로그램을 종료합니다")

위의 예외 처리를 변수를 이용하면 원래 파이썬에 저장되어있는 오류를 출력함

try:
  data = [10,20,30,40,50]
  #print(data[5])
  #print(int('안녕'))
  print(5/0)

except IndexError as e:
  print(e)
except ValueError as e:
  print(e)
except ZeroDivisionError as e:
  print(e)
except:#전체 except는 항상 맨 밑에다가 해주어야함
  print("예외가 발생했습니다.")
print("프로그램을 종료합니다")

에러가 나도 반드시 실행되게 할수 있는 예제이다

try:
  data = [10,20,30,40,50]
  print(data[5])
  #print(int('안녕'))
  #print(5/0)

except IndexError as e:
  print(e)
except ValueError as e:
  print(e)
except ZeroDivisionError as e:
  print(e)
except:
  print("에러가 발생하지 않은 정상적인 프로그램.")
finally:
  print("에러에 관계없이 무조건 실행되는 문장")#
print("프로그램을 종료합니다")

3. Exception 클래스

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

  1. 상속: 예외 유형은 Exception을 상속받아서 정의됩니다. 예를 들면 ValueError, TypeError, FileNotFoundError 등이 있습니다. 이 상속 구조 덕분에 except Exception 블록은 Exception을 상속받은 모든 예외를 캡처할 수 있습니다.
  2. 메시지: 예외가 생성될 때, 일반적으로 오류 메시지를 함께 전달할 수 있습니다. 이 메시지는 예외 객체의 args 속성을 통해 접근 가능하며, 예외를 문자열로 변환할 때(예: str(e)) 해당 메시지가 반환됩니다.
#raise: 예외 상황을 발생시킴
try:
  raise Exception('예외가 발생했습니다!')
except Exception as e:
  print(e)

 
def func1():
  n = int(input('짝수를 입력하세요:'))
  if n % 2 == 1:
    raise Exception('홀수가 입력되었습니다.')
  print(n)
func1()

try:
  func1()
except Exception as e:
  print('예외가 발생:',e)

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

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

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

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

 
  • 문제2

    • 사용자 정의 예외 클래스를 직접 만들고 활용해보자
    • 아래 클래스와 함수의 내용을 채우기
    • 단, 나이의 범위는 아래와 같다
      • ZM세대: 14살 ~ 43살
      • X세대: 44살 ~
      • 알파세대: ~ 13살
class AgeLimitError(Exception):
  def __init__(self,age,message='MZ세대 나이 범위가 아님'):
    self.age = age
    self.message = message
    super().__init__(self.message)#Exception('메세지')
def check_Age(age):
  if age < 14:
    raise AgeLimitError(age,'MZ 나이 범위보다 작음.')
  elif age > 43:
    raise AgeLimitError(age,'MZ 나이 범위보다 큼.')
  else:
    return age, 'mz 나이 범위 안에 포함'
ages = [17,60,46,20,80,55,26,12,5]

for age in ages:
  try:
    print(check_Age(age))
  except AgeLimitError as e:
    print(f'{e.age}나이 에러:{e}')
# try:
#   for age in ages:
#     check_Age(age)
# except AgeLimitError as e:
#   print(age,e)



 

'인공지능 > 파이썬 기초' 카테고리의 다른 글

파일 입출력  (0) 2024.10.02
파이썬 모듈  (0) 2024.10.01
스페셜 메서드  (0) 2024.10.01
파이썬의 상속  (0) 2024.10.01
클로저와 데코레이터  (0) 2024.10.01