[python] 예외 처리 사용하기

anjiyoo·2024년 3월 8일

Python

목록 보기
36/41
post-thumbnail

1.예외

  • 코드를 실행하는 중에 발생한 에러
  • 예외가 발생하면 해당 줄에서 코드 실행 중단하고 바로 except로 가서 코드 실행
  • AttributeError. NameError, TypeError 등
try:
	실행할 코드
except:
	예외가 발생했을 때 처리하는 코드
try:
	x = int(input('나눌 숫자를 입력하세요: '))  # 예외 발생 시 실행 중단
    y = 10 / x  # 예외 발생시 실행 중단
    print(y)  # 예외 발생시 실행 중단
except:  # 예외가 발생했을 때 실행됨 
	print('예외가 발생했습니다.)

1-1.특정 예외만 처리하기

try:
	실행할 코드
except 예외이름:
	예외가 발새했을 때 처리하는 코드
y = [10, 20, 30]

try:
	index, x = map(int, input('인덱스와 나눌 숫자를 입력하세요: ').split())
    print(y[index] / x)
except ZeroDivisionError:  # 숫자를 0으로 나눠서 에러가 발생했을 때 실행
	print('숫자를 0으로 나눌 수 없습니다')
except 	IndexError:  # 범위를 벗어난 인덱스에 접근해 에러가 발생했을 때 실행
	print('잘못된 인덱스입니다')

1-2.예외의 에러 메시지 받아오기

try:
	실행할 코드
except 예외 as 변수:
	예외가 발생했을 때 처리하는 코드
y = [10, 20, 30]

try:
	index, x = map(int, input('인덱스와 나눌 숫자를 입력하세요: ').split())
    print(y[index] / x)
except ZeroDivisionError as e:  # as 뒤에 변수를 지정하면 에러 받아옴
	print('숫자를 0으로 나눌 수 없습니다', e)  # e에 저장된 에러 메시지 출력
except 	IndexError as e:  
	print('잘못된 인덱스입니다', e)

🔥 모든 예외의 에러 메시지를 출력할 때는 Exception 사용


1-3.else와 finally 사용하기

  • elseexcept 바로 다음에 와야하며 except는 생략 할 수 없음
try:
	실행할 코드
except 예외 as 변수:
	예외가 발생했을 때 처리하는 코드
else:
	예외가 발생하지 않았을 때 실행할 코드
try:
	x = int(input('나눌 숫자를 입력하세요: '))
    y = 10 / x
except ZeroDivisionError:  # 숫자를 0으로 나눠서 에러가 발생했을 때 실행
	print('숫자를 0으로 나눌 수 없습니다'))
else:  # try의 코드에서 예외가 발생하지 않았을 때 실행
	print(y)

1-4.예외와는 상관없이 항상 코드 실행하기

  • finallyexceptelse를 생략할 수 있음
try:
	실행할 코드
except 예외 as 변수:
	예외가 발생했을 때 처리하는 코드
else:
	예외가 발생하지 않았을 때 실행할 코드
finally:
	예외 발생 여부와 상관없이 항상 실행할 코드
try:
	x = int(input('나눌 숫자를 입력하세요: '))
    y = 10 / x
except ZeroDivisionError:  # 숫자를 0으로 나눠서 에러가 발생했을 때 실행
	print('숫자를 0으로 나눌 수 없습니다'))
else:  # try의 코드에서 예외가 발생하지 않았을 때 실행
	print(y)
finally:  # 예외 발생 여부와 상관없이 항상 실행됨
	print('코드 실행이 끝났습니다')

2.예외 발생시키기

  • 직접 예외를 발생시킬 때 raise에 예외를 지정하고 에러 메시지(생략 가능) 넣음
try:
	raise Exception(에러베시지)  # 예외를 발생시킴
except Exception as e:  # 예외가 발생했을 때 실행됨
	print(e)  # Exception에 지정한 에러 메시지가 e에 들어감
try:
	x = int(input('3의 배수를 입력하세요: '))
    if % 3 != 0:  # x가 3의 배수가 아니면
    	raise Exception('3의 배수가 아닙니다')  # 예외를 발생시킴
    print(x)
except Exception as e:  # 예외가 발생했을 때 실현됨
	print('예외가 발생했습니다', e)

2-1.raise의 처리 과정

def three_multiple():
	x = int(input('3의 배수를 입력하세요: '))
    if x % 3 != 0:  # x가 3의 배수가 아니면
    	raise Exception('3의 배수가 아닙니다'))  # 예외를 발생시킴
    print(x)  # 예외를 상위 코드 블록으로 넘김
    
try:
	three_multiple()
expt Exception as e:  # 하위 코드 블록에서 예외가 발생해도 실행됨
	print('예외가 발생했습니다', e)

2-2.현재 예외를 다시 발생시키기 re-raise

def three_multiple():
  try:
      x = int(input('3의 배수를 입력하세요: '))
      if x % 3 != 0:  # x가 3의 배수가 아니면
          raise Exception('3의 배수가 아닙니다'))  # 예외를 발생시킴
      print(x)
  except Exception as e:  # 함수 안에서 예뢰를 처리함
  		print('three_multiple 함수에서 예외가 발생했습니다', e)
        raise  # raise로 현재 예외를 다시 발생시켜 상위 코드로 블록 넘김
    
try:
	three_multiple()
expt Exception as e:  # 하위 코드 블록에서 예외가 발생해도 실행됨
	print('예외가 발생했습니다', e)

2-3.assert로 예외 발생시키기

  • assert는 지정된 조건식이 거짓일 때 AssertionError 예외를 발생 시키고 조건식이 참이면 그냥 넘어감
  • assert는 디버깅 모드에서만 실행
  • 파이썬은 기본적으로 디버깅 모드로 assert가 실행되지 않게 하려면 아래 코드로 실행
# assert 중지
python -0 스크립트파일.py
assert 조건식
assert 조건식, 에러메시지
x = int(input('3의 배수를 입력하세요: '))
assert x % 3 == 0, '3의 배수가 아닙니다'  # 3의 배수가 아니면 예외 발생
pirnt(x)  # 3의 배수면 그냥 넘어감

3.예외 만들기 (사용자 정의 예외)

  • 사용자가 직접 만든 예외
  • Exception 상속받으면 됨
class 예외이름(Exceptiono):  # 예외 만들기
	def __init__(self):
    	super().__init__('에러메시지')
raise 예외   # 예외 발생시키기
profile
기록으로 흔적을 남기는 것을 좋아합니다

0개의 댓글