기록하는삶

[파이썬/Python] Built in Exception, 예외 처리, try-except 구문 활용 본문

AI/파이썬(Python)

[파이썬/Python] Built in Exception, 예외 처리, try-except 구문 활용

mingchin 2022. 1. 12. 20:02
728x90
반응형

코드를 짜다보면 사용자의 예상치 못한 사용이나, 예상되는 실수들로 인한 오류 및 예외들에 대해 처리해 줄 필요가 있다. 이런 예외들을 exception이라 하며, 보통 아래의 두 가지 경우를 포함한다.

 

1) 예상 가능한 예외

개발자가 코드 상에서 해결할 수 없는 문제로, 발생했을 때 비정상적인 종료에 앞서 진행 상황을 저장하거나, 오류의 원인을 고지하는 등 추가적인 조치가 필요하다. try-except 구문의 사용이 권장된다.

 

Ex)

- 함수의 변수를 입력하지 않거나, 잘못된 형식의 변수를 사용하는 경우

- 사용자의 입력에 오류가 있는 경우

- 파일 호출 시 파일이 존재하지 않는 경우

 

2) 예상 불가능한 예외

개발자의 실수로 인한 문제. 수행 불가능한 코드를 던지는 경우, 인터프리터가 자동으로 예외에 대한 처리를 해준다.

 

Ex)

- 0으로 나눗셈을 시도하는 경우

- 존재하지 않는 index에 대한 list, tuple의 호출을 시도하는 경우

 

파이썬에서의 예외 처리(Exception Handling)

1) Built in Exception

 

파이썬이 제공하는 기본적인 예외 처리는 아래와 같다.

ValueError 변환할 수 없는 문자/숫자에 대한 변환을 시도
IndexError / KeyError 존재하지 않는 index에 대한 호출 (KeyError는 dictionary에서)
NameError 존재하지 않는 (지역/전역)변수의 호출
TypeError 잘못된 type의 변수가 전달된 경우
ImportError 모듈에서 import가 실패
FileNotFoundError 존재하지 않는 파일을 불러올 경우
SyntaxError 문법에 오류가 있는 경우
AttributeError 클래스의 attribute 호출 시 문제가 발생하는 경우
RecursionError 재귀 깊이 초과
ZeroDivisionError 0으로 나누기를 시도
ModuleNotFoundError 설치하지 않은 모듈의 호출
OverflowError 표현할 수 있는 수의 범위를 넘어가는 경우

외에 기타 오류들은 링크에서 확인할 수 있다.

 

2) try - except 구문의 활용

 

a = [1,2]
for i in range(3):
    try:
        print(3//i)
        print(a[i],b)
    except ZeroDivisionError as error:
        print(error)
        print('0 으로 나누시면 안됩니다!')
    except Exception as error2:
        print(error2)
        print('뭔가 오류가 발생했습니다!')
    finally:
        print('='*30)

위처럼 일단 try 구문을 시도하여 문제가 발생하지 않으면 그대로 실행하고, 예외가 발생하면 except 구문의 지시에 따른다. 발생하는 예외의 종류에 따라 어떻게 처리할 지 여부를 except 구문에 포함시킬 수 있으며, 예외의 종류에 관계없이 Exception으로 모든 예외를 받을 수도 있다.(혹은 따로 적지 않아도 마찬가지다.) 다만 모든 에러를 Exception으로 받아버리면 사용자가 어떤 에러인지 알 수 없는 문제가 있으므로, 해당 방법은 지양하는 것이 좋다.

 

또한 finally를 사용하면, 에러 발생 여부와 관계 없이 실행되는 구문을 추가할 수 있다.

 

예외 처리가 필요한 가장 간단한 문제에 대한 예시는 이 글을 참고하면 된다.

 

3) 직접 예외 처리 혹은 예외 처리에 대한 문구를 추가하는 경우

 

print문으로 예외 처리에 대한 문구를 띄우는 것이 아니라, built-in-error처럼 예외 처리 문구를 발생시키고자 하는 경우 raise 함수를 이용할 수 있다.

def f(x,y):
    if type(x)!=int or type(y)!=int:
        raise TypeError('정수를 입력하세요')
    return abs(x-y)
    
f(2,6)

f(2,'a')

또한 booltype의 조건을 만들어 놓고, 해당 조건을 만족하지 않는 경우 AssertionError를 발생시키는 것도 가능한데, asseert 함수를 사용하면 된다.

def f(x,y):
    assert isinstance(x,int) and isinstance(y,int)
    return abs(x-y)
    
f(2,6)

f(2,'a')

마찬가지 문구를 띄우고 싶다면 raise 함수를 적절히 사용해야 한다.

728x90
반응형