Python 예외처리 기본개념

2022-03-19

.

Python_studynote(20220319)

[학습자료]

패스트 캠퍼스 “초격차 패키지 : 한 번에 끝내는 파이썬 웹 개발” 강의를 공부하고 정리한 내용입니다.

** URL : https://fastcampus.co.kr/dev_online_pyweb

[학습내용]

  • try, except
try:
    예외가 발생할 수 있는 구문

except:
    예외발생시 실행할 코드

else:
    예외가 발생하지 않는 경우 실행할 코드

finally:
    항상 실행할 코드
  • try, except 에시

원화를 입력하고, 환율을 입력하면 달러값으로 변환하는 프로그램

won = input("원화금액을 입력 하세요>>>")
dollar = input("환율을 입력 하세요>>>")

try: # 예외가 발생 할 수 있는 코드
    print(int(won) / int(dollar))
# 예외가 발생했을 때 실행되는 코드로 그냥 except: 로 처리해도 되지만
# 사용자가 except 시 에러를 아래와 같이 지정할 수 있다.
# 아래와 같이 except: Error를 작성하여
# 사용자가 지정한 에러를 레이징 할 수 있도록 지정도 가능하다
# as e(error 메세지) 를 붙여주게 되면 출력할때 아래와 같이 에러메세지도
# 같이 출력이 가능하다.
except ValueError as e:
    print("예외가 발생했습니다.", e)
except ZeroDivisionError as e:
    print("예외가 발생했습니다.", e)
else:
    print("예외가 발생하지 않았을 때 실행되는 코드")
# 파일을 열고나서 뭔가 실행을 하고 파일 닫기를 해줘야 하는 등 리소스 반환이 필요한 경우에는 finally를 쓰게된다. 
finally: 
    print("예외가 발생하던지, 발생하지 않던지 항상 실행되는 코드")

정상적으로 입력이 된 경우

원화금액을 입력 하세요>>>1000000
환율을 입력 하세요>>>1200
833.3333333333334 USD
예외가 발생하지 않았을 때 실행되는 코드
예외가 발생하던지, 발생하지 않던지 항상 실행되는 코드

입력값에 문자열을 넣었을 경우 –> ValueError

원화금액을 입력 하세요>>>text
환율을 입력 하세요>>>qwe
예외가 발생했습니다. invalid literal for int() with base 10: 'text'
예외가 발생하던지, 발생하지 않던지 항상 실행되는 코드

달러에 0을 넣었을 경우 –> ZeroDivisionError

원화금액을 입력 하세요>>>100000
환율을 입력 하세요>>>0
예외가 발생했습니다. division by zero
예외가 발생하던지, 발생하지 않던지 항상 실행되는 코드
  • raise는 에러를 강제로 만들기 위한 구문이다.

사용법은 아래와 같다.

raise 예외("에러 메세지")

아래와 같은 예외 계층구조를 이용해서 에러메세지를 세부적으로 구현할 수 있다.

스크린샷 2022-03-19 오후 2 04 28

raise 구문을 사용해서 에러를 강제로 발생시키는 예시 : 음수를 입력 받는 프로그램

try:
    num = int(input("음수를 입력해 주세요>>>"))
    if num >= 0:
        raise ValueError("양수는 입력 불가")
except ValueError as e:
    print("에러 발생!", e)

정상실행되는 경우

음수를 입력해 주세요>>>-2

양수를 입력해서 예외상황이 될때

음수를 입력해 주세요>>>2
에러 발생! 양수는 입력 불가

문자열을 입력해서 예외상황이 될때

음수를 입력해 주세요>>>aaa
에러 발생! invalid literal for int() with base 10: 'aaa'

아래와 같이 PositiveNumberError라는 커스텀한 에러를 만들수도 있다.

Exception 클래스를 상속받아서 아래와 같이 만들면 된다.

class PositiveNumberError(Exception):
    def __init__(self):
        super().__init__("양수는 입력 불가")

try:
    num = int(input("음수를 입력해 주세요>>>"))
    if num >= 0:
        raise PositiveNumberError
except PositiveNumberError as e:
    print("에러 발생!", e)

양수를 넣어서 실행하면 아래와 같이 커스텀 에러가 발생한다.

음수를 입력해 주세요>>>11
에러 발생! 양수는 입력 불가