Python

[Python] 예외처리(Exception handling)

dalovee 2022. 8. 22. 18:23
728x90

코딩을 하다보면 오류 발생하는 경우가 정말 정말 정말 정말 많다:)

오류의 종류를 살펴보면,

 

  • 구문적 오류(Syntax Error)
    • 문법 오류에 의하여 기계어 변환 과정에서 발생하는 오류
  • 실행 오류(Runtime Error)
    • 프로그램 실행 중 발생하여 프로그램이 비정상적으로 종료되는 오류
  • 의미적 오류(Semantic Error)
    • 문법은 정상이지만 실행의 결과가 원하는 대로 나오지 않는 오류
    • 이런 경우 어디서 오류가 났는지 찾기가 어렵다고 한다...

 

예외처리

프로그램 개발을 하다보면 예상치 못한 상황이 많이 생긴다.

입출력 오류와 같은 상황 발생 시 프로그램 종료를 방지하기 위해 예외처리 구문이 쓰인다.

또한, 개발자가 예외 발생 가능 부분을 어떻게 대응하라고 지정해줄 수 있다.

try:
	code context(예외 발생할 거 같은 코드)
except:
	code context(예외 발생 시 처리 내용 작성)

예를 들어, 0으로 나누어 생기는 상황이 발생해 오류가 생긴다고 해보자.

n = 100

for i in range(0,10):
	try:
    	print(n/i)
    except:
    	print("에러발생")

=> 만약, i가 0이어서 나누기 오류가 생긴다면 "에러발생" 구문을 실행한다.

 

 

어떤 에러인지 에러메세지를 확인할 수 있다.

n = 100

for i in range(0,10):
	try:
    	print(n/i)
    except ZeroDivision Error as e:
    	print(e) # division by zero

이렇게 에러 메세지를 출력할 수도 있다.

 

 

+) try ~ except ~ else 문

n = 100
for i in range(10):
    try:
        result = n/i
    except ZeroDivisionError as e:
        print(e)
    else:
        result **= 2
        print(result)

=> else문은 예외가 발생하지 않을 경우 수행할 코드를 입력한다.

n/i가 에러가 나면 except문을 실행해 에러 메세지를 출력하고

n/i가 에러가 나지 않으면 else문을 실행해 출력한다.

 

+) ~ finally문

for a in range(3):
    try:
        result = 100/a
    except ZeroDivisionError as e:
        print(e)
    else:
        print("정상적으로 연산되었습니다.")
    finally:
        print("처리완료")

=> finally문은 에러 발생 여부와 상관 없이 무조건 수행한다.

 

 

✅ 정리하자면

try:
    예외가 발생 가능한 코드
except:
    예외 발생 시 실행 코드
else:
    예외 발생하지 않았을 경우 실행
finally:
    예외 발생 여부와 상관없이 항상 실행할 코드

 

많이 발생하는 오류

🚫 IndexError : 리스트의 인덱스 범위를 넘어갈 때 발생

a = [1, 2, 3]
a[5] #error

🚫 NameError : 정의되지 않은 변수를 사용하려 할 때 발생

name # error, name 변수가 정의되지 않았기 때문

🚫 ValueError : 변환할 수 없는 자료형 변환을 시도할 때 발생

a = "홍길동"
int(a) # str -> int로 변환시도해서 error

🚫 TypeError : 자료형이 맞지 않는 연산을 시도하거나 호출할 수 없는 객체를 함수처럼 호출할 때 발생

12/"나이" # error

a = 10
a() # error

🚫 FileNotFoundError : 없는 파일을 읽어드리려 할 때 발생

🚫 AttributeError : 객체에 없는 속성을 사용하려 할 때 발생

class MyClass:
	def do_func(self):
    	self.a = self.a + 2 #error

mc = MyClass()
mc.do_func() #error

 

에러 발생 문

raise문

개발자가 필요할 때 에러를 일부로 발생시킬 때 사용하는 문이다.

if문과 함께 많이 사용된다.

num = 0
if num == 0:
	raise ValueError("0으로 나눌 수 없어요")

=> num 값이 0인 경우 에러를 발생시키고, "0으로 나눌 수 없어요"라는 메세지를 출력한다.

 

assert문

조건이 거짓일 경우에만 에러를 발생시킨다.

def div(a, b):
	assert b > 0, "1이상의 정수만 입력하세요"
    return a/b

div(6,0)

=> b가 0보다 작을 때 에러를 발생시키고 에러 메세지를 출력한다.

728x90