티스토리 뷰

Python

18. 파이썬의 예외처리

muru_ 2024. 3. 19. 17:27

1. 예외

- 프로그램 실행 중 발생할 수 있는 예상치 못한 문제 또는 오류 상황을 의미
- 예외가 발생하면 프로그램은 중단되기 때문에 이를 적절하게 처리하

    중단을 방지하거나 오류에 대한 정보를 사용자에게 제공해야 함

print(10/3)
print(5/0)    # 에러가 난 다음부터는 진행이 안됨
print(4/2)

# 프로그램에 오류가 나더라도 일단 넘기고, 다른 곳에 저장해두기 (로그 남긴다)
# 에러도 객체화시켜서 에러 메시지가 나오는 것

# 기본 형태
try:
    # 예외가 발생할 가능성이 있는 코드

except ExceptionType1:  # 'ExceptionType1'에는 실제 예외 유형이 들어갑니다.
    # ExceptionType1    # 예외가 발생했을 때 실행될 코드

except ExceptionType2:  # 'ExceptionType2'에는 다른 예외 유형이 들어갑니다.
    # ExceptionType2    # 예외가 발생했을 때 실행될 코드

추가적인 except 블록을 계속 추가할 수 있습니다.

else:
    # try 블록에서 예외가 발생하지 않았을 때 실행될 코드

finally:
    # 예외 발생 여부와 관계없이 항상 실행될 코드

 

적용

# ZeroDivisionError 처리
try:
  print(10/3)
  print(5/0)
  print(4/2)   # 실행 x
except ZeroDivisionError:
  print('0으로 나눌 수 없습니다')
print('프로그램을 종료합니다')

# 생략시 모든 에러 처리
try:
  print(10/3)
  print(5/0)
  print(4/2)   # 실행 x
except:        # 모든 에러들을 상속해주는 부모 클래스
  print('0으로 나눌 수 없습니다')
print('프로그램을 종료합니다')

# IndexError 처리
try:
  data = [10, 20, 30, 40, 50]
  print(data[0])   # 실행
  print(data[5])   # 에러
  print(data[3])   # 실행 x
except IndexError:
  print('인덱스 지정이 올바르지 않습니다')
print('프로그램 종료')

except: vs. except Exception:

1. except:

  • 모든 예외를 처리합니다. 예외 종류에 상관없이 예외가 발생하면 except 블록의 코드가 실행됩니다.
  • 일반적인 예외 처리에 유용합니다. 예외 종류를 명시적으로 알 필요 없이 예외 상황에 대한 처리를 수행할 수 있습니다.

2. except Exception:

  • except: 와 유사하지만 BaseException 의 하위 클래스인 모든 예외를 처리합니다.
  • 대부분의 예외를 처리하지만, 내장 예외 외 사용자 정의 예외는 처리하지 못합니다.

 1) 여러 종류 에러 처리

try:
  data = [10, 20, 30, 40, 50]
  print(data[0])
  print(int('일'))     # ValueError
  print(5/0)          # ZeroDivisionError
  print(data[5])
  print(data[3])

except IndexError:
  print('인덱스 지정이 올바르지 않습니다')
except ZeroDivisionError:
  print('0으로 나눌 수 없습니다')
except ValueError:
  print('문자열을 정수로 변환했습니다')
except :                    # 모든 오류를 처리하므로 맨밑으로 내려가야함
  print('오류를 모두 처리합니다')  # 위에 쓰면 혼자 다 걸러버리게 됨
print('프로그램 종료')

 

 

 2) as로 오류메시지 출력 

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 as e:
  print(e)
except ZeroDivisionError as e:
  print(e)
except ValueError as e:
  print(e)
except Exception as e:          # exception 클래스가 상위에 있음, 생략 가능
  print(e)
print('프로그램 종료')

 

 3) else문과 finally문 추가

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 as e:
  print(e)
except ZeroDivisionError as e:
  print(e)
except ValueError as e:
  print(e)
except Exception as e:          # exception 클래스가 상위에 있음, 생략 가능
  print(e)
else:
  print('정상적인 프로그램 진행')
finally:
  print('오류에 관계없이 무조건 실행되는 문장')
print('프로그램 종료')

 

 

2. Exception 클래스

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

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

def func1():
  n = int(input('짝수를 입력하세요 : '))
  if n%2 != 0:
    raise Exception('짝수가 아닙니다')
  print(n)       # 결과 : Exception: 짝수가 아닙니다
  
try:
  func1()
except Exception as e:
  print('예외가 발생 :', e)  # 결과 : 예외가 발생 : 짝수가 아닙니다

 

def func1():
  func2()

def func2():
  func3()

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

func1()

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

def func2():
  func3()

def func3():
  print('%d' % '문자열')

func1()

# 방법 3
def func1():
  func2()

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

def func3():
  print('%d' % '문자열')

func1()

# 방법 4
def func1():
  func2()

def func2():
  func3()

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

func1()
func1()이 맨밑에 깔리고, 그 위로 func2(), 그 위로 func3()가 쌓이는 식  
실행할 땐 func3() -> func2() -> func1()
func3()에서 에러가 나면 func2()가 수습하고 그 다음으로 func1()가 수습

 

3. 사용자 정의 예외 클래스를 직접 만들고 활용하기

class AgeLimitError(Exception):   # 모든 오류가 들어있는 Exception 클래스 상속받기
    def __init__(self, age, message = '원하는 나이 범위가 아님'):    # message 기본값 설정
        self.age = age
        self.message = message
        super().__init__(message)    # 상위 클래스인 Exception에 message를 보낸다
# 조건에 맞으면 raise를 통해 에러를 발생
def check_age(age):
  if age < 20:
    raise AgeLimitError(age, '나이 범위보다 어림')
  elif age > 50:
    raise AgeLimitError(age, '나이 범위보다 큼')
  else :
    return '나이 범위 안에 포함'
    
ages = [17, 26, 36, 60, 59, 48, 40]

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 59: 나이 범위보다 큼
나이 범위 안에 포함
나이 범위 안에 포함

 

'Python' 카테고리의 다른 글

20. 파이썬의 모듈  (0) 2024.03.21
19. (과제3) 주민등록번호 유효성 검사  (0) 2024.03.21
17. 파이썬의 스페셜 메서드  (0) 2024.03.19
16. 파이썬의 상속  (0) 2024.03.19
15. 파이썬의 클로저와 데코레이터  (0) 2024.03.19
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함