예외 처리와 오류 관리
1. Error의 종류
모든 에러는 아래 공식문서에서 확인할 수 있습니다.
내장 예외1.1. 문법 에러(Syntax Error)
문법 에러는 파이썬 코드를 실행하기 전에 발생하는 에러로, 코드 작성 시 오타나 문법적인 오류가 있을 경우 발생합니다.
이 경우 파이썬 인터프리터는 해당 줄에서 에러가 발생했음을 알려주며, 발견된 오류의 위치와 종류를 알려줍니다.
1.2. 이름 에러(Name Error)
이름 에러는 정의되지 않은 변수나 함수를 호출했을 때 발생합니다.
이 경우 파이썬 인터프리터는 해당 변수나 함수를 찾을 수 없다는 메시지를 출력합니다.
1.3. 타입 에러(Type Error)
타입 에러는 서로 다른 타입의 변수 간 연산이나 함수 호출 시 발생합니다.
이 경우 파이썬 인터프리터는 해당 연산이나 함수 호출이 불가능하다는 메시지를 출력합니다.
1.4. 인덱스 에러(Index Error)
인덱스 에러는 리스트나 튜플 등의 시퀀스 타입에서 존재하지 않는 인덱스를 호출했을 때 발생합니다.
이 경우 파이썬 인터프리터는 해당 인덱스를 찾을 수 없다는 메시지를 출력합니다.
1.5. 키 에러(Key Error)
키 에러는 딕셔너리에서 존재하지 않는 키를 호출했을 때 발생합니다.
이 경우 파이썬 인터프리터는 해당 키를 찾을 수 없다는 메시지를 출력합니다.
1.6. 값 에러(ValueError)
값 에러는 내장 함수나 메서드의 인자로 전달된 값의 타입이나 값이 유효하지 않을 때 발생합니다.
이 경우 파이썬 인터프리터는 해당 값을 처리할 수 없다는 메시지를 출력합니다.
1.7. 제로 나누기 에러(ZeroDivisionError)
제로 나누기 에러는 0으로 나누기 연산을 수행할 때 발생합니다.
이 경우 파이썬 인터프리터는 해당 연산이 불가능하다는 메시지를 출력합니다.
1.8. 어트리뷰트 에러(Attribute Error)
어트리뷰트 에러는 객체에 존재하지 않는 속성이나 메서드를 호출했을 때 발생합니다.
이 경우 파이썬 인터프리터는 해당 속성이나 메서드를 찾을 수 없다는 메시지를 출력합니다.
1.9. 인자 개수 에러(TypeError)
인자 개수 에러는 함수나 메서드에 전달된 인자의 개수가 맞지 않을 때 발생합니다.
이 경우 파이썬 인터프리터는 해당 함수나 메서드에 전달된 인자의 개수가 맞지 않다는 메시지를 출력합니다.
1.10. 파일 입출력 에러(File I/O Error)
파일 입출력 에러는 파일을 열거나 쓰거나 읽을 때 발생할 수 있습니다.
파일이 존재하지 않거나 권한이 없는 경우 발생할 수 있으며, 이 경우 파이썬 인터프리터는 해당 파일을 찾을 수 없다는 메시지를 출력합니다.
2. python 예외처리
파이썬에서 예외(exception)란 프로그램이 실행 중 예기치 않은 상황이 발생하여 프로그램이 종료되는 것을 의미합니다.
예를 들어, 정수를 0으로 나누려고 시도하거나, 존재하지 않는 파일을 열려고 시도하는 등의 상황에서 예외가 발생할 수 있습니다.
이러한 예외 상황에서 프로그램이 강제 종료되는 것을 방지하고, 예외 상황을 처리하는 방법을 "예외 처리"라고 합니다.
🧐 google convention에서는 try와 except를 최소 단위로 사용하길 권고합니다. 이는 에러가 나는 정확한 위치를 파악하기 위함입니다.
2.1. 예외란? 예외처리 방법 try except
예외란 프로그램이 실행 중 예기치 않은 상황이 발생하여 프로그램이 종료되는 것을 말합니다.
이러한 예외 상황에서 프로그램이 강제 종료되는 것을 방지하고, 예외 상황을 처리하는 방법을 "예외 처리"라고 합니다.
파이썬에서는 try except 구문을 사용하여 예외 처리를 할 수 있습니다.
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외 처리 코드
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외 처리 코드
발생하는 에러를 한꺼번에 처리 할 수 있습니다.
예상되는 에러가 있다면 에러명을 함께 명시해주면 아래처럼 처리할 수 있습니다.
아래와 같은 코드도 가능합니다.
s = 1/0
에서 1/1
로 값을 바꿔 ZeroDivisionError
을 회피할 수 있도록 하였습니다.
그 아래에는 IndexError
를 발생시켰습니다.
이를 처리하는 로직이 없기 때문에 모든 오류를 한꺼번에 처리하는 except
로 이동하여 ‘오류가 났습니다!’를 출력합니다.
2.2. 예외 처리 방법 try, except, else, finally, assert
2.2.1 try + except
try except 구문을 사용하여 예외 처리를 할 수 있습니다.
try 블록 내에서 예외가 발생하면, except 블록이 실행되고 프로그램이 종료되지 않습니다.
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외 처리 코드
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외 처리 코드
2.2.2 try + except + else
try except else 구문을 사용하여 예외 처리를 할 수 있습니다.
try 블록 내에서 예외가 발생하지 않으면, else 블록이 실행됩니다.
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외 처리 코드
else:
# 예외가 발생하지 않을 때 실행되는 코드
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외 처리 코드
else:
# 예외가 발생하지 않을 때 실행되는 코드
2.2.3 try + finally
try finally 구문을 사용하여 예외 처리를 할 수 있습니다.
finally 블록은 예외 발생 여부와 상관없이 항상 실행됩니다.
try:
# 예외가 발생할 가능성이 있는 코드
finally:
# 예외 발생 여부와 상관없이 항상 실행되는 코드
try:
# 예외가 발생할 가능성이 있는 코드
finally:
# 예외 발생 여부와 상관없이 항상 실행되는 코드
2.2.4 try + except + finally
try except finally 구문을 사용하여 예외 처리를 할 수 있습니다.
finally 블록은 예외 발생 여부와 상관없이 항상 실행됩니다.
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외 처리 코드
finally:
# 예외 발생 여부와 상관없이 항상 실행되는 코드
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외 처리 코드
finally:
# 예외 발생 여부와 상관없이 항상 실행되는 코드
2.2.5 try + except + else + finally
try except else finally 구문을 사용하여 예외 처리를 할 수 있습니다.
else 블록은 예외가 발생하지 않을 때 실행되는 코드이며, finally 블록은 예외 발생 여부와 상관없이 항상 실행됩니다.
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외 처리 코드
else:
# 예외가 발생하지 않을 때 실행되는 코드
finally:
# 예외 발생 여부와 상관없이 항상 실행되는 코드
try:
# 예외가 발생할 가능성이 있는 코드
except:
# 예외 처리 코드
else:
# 예외가 발생하지 않을 때 실행되는 코드
finally:
# 예외 발생 여부와 상관없이 항상 실행되는 코드
try-except-else문에서 else는 예외가 발생하지 않을 때 쓰입니다.
try:
실행문
except:
예외 발생 시 처리문
else:
예외 발생하지 않을 경우 실행문
try:
실행문
except:
예외 발생 시 처리문
else:
예외 발생하지 않을 경우 실행문
1.0
1.0
2.2.5 assert
assert는 가정설정문입니다.
내가 설정한 조건에 만족하지 않는 경우 error를 발생시킬 수 있습니다.
아래 예시 코드를 살펴보도록 하겠습니다.
2번에서는 AssertionError가 발생하며 2번을 주석처리하면 3번에서는 str과 int가 더해질 때 나오는 TypeError가 출력되게 됩니다.
3. 에러 발생시키기, 에러 만들기
에러는 아래와 같이 raise
를 사용하여 발생시킬 수 있습니다. 순차적으로 실행해보세요.
raise
raise ValueError
raise ValueError('코드를 잘~~ 만들어주세요.')
raise
raise ValueError
raise ValueError('코드를 잘~~ 만들어주세요.')
아래와 같이 에러별 분기도 가능합니다.
다음과 같이 에러를 만드는 것도 가능합니다.
Exception를 상속받아 에러를 생성하며 부모 클래스의 init을 오버라이딩하여 에러와 함께 출력할 문구를 설정할 수도 있습니다.
4. 오류 처리와 로깅
로깅 HOWTO로깅은 경고, 접근, 에러, 예외 처리, 특정 함수 사용 등에 대한 기록을 남기는 행위입니다.
주로 화면에 출력하거나 DB또는 일반 plane text로 남기는 방식을 사용합니다.
로그기록이 너무 많을 경우 시스템에 부하를 줄 수 있으며, 일반적인 편집기가 읽지 못할 수 있습니다.
로그를 남기는 것도 오류 관리의 중요한 부분입니다.
logging
모듈을 사용하면 다양한 레벨의 로그를 쉽게 남길 수 있습니다.
💡 해당 코드는 colab에서 제대로 작동하지 않습니다. 아래 코드를 실행하고 싶다면 .py파일을 만들어 실행해주세요.
colab에서도 작동하는 코드입니다. 이 코드를 사용해 테스트해보세요.