개발을 하다 보면 크고 작은 에러를 마주치게 됩니다. 특히 Python에서는 다양한 예외가 발생할 수 있으며, 이를 효과적으로 처리하지 않으면 프로그램이 중단될 수 있습니다. 이 글에서는 중·고급 개발자를 대상으로 Python에서 자주 발생하는 오류 유형과 그에 대한 효과적인 처리 방법을 정리해보겠습니다.
1. TypeError: ‘type’ object is not subscriptable
원인: 해당 에러는 리스트, 튜플, 딕셔너리와 같은 서브스크립트(subscript) 가능한 객체가 아닌 타입을 서브스크립트로 접근하려 할 때 발생합니다.
예제 코드:
class Sample:
pass
print(Sample[0]) # TypeError 발생
해결 방법:
- 클래스 또는 타입 객체가 아닌 리스트, 튜플, 딕셔너리를 사용해야 합니다.
- 제네릭(Generic) 사용 시 올바르게 타입을 지정해야 합니다.
sample_instance = Sample()
print(sample_instance) # 올바른 객체 사용
2. IndexError: list index out of range
원인: 리스트에서 존재하지 않는 인덱스에 접근할 때 발생하는 오류입니다.
예제 코드:
my_list = [1, 2, 3]
print(my_list[5]) # IndexError 발생
해결 방법:
- 리스트의 길이를 확인하고 접근해야 합니다.
try-except
를 사용하여 예외를 적절히 처리합니다.
try:
print(my_list[5])
except IndexError:
print("인덱스 범위를 벗어났습니다.")
3. ValueError: 올바르지 않은 값 사용
원인: 함수나 연산에서 허용되지 않는 값을 입력받을 때 발생합니다.
예제 코드:
def rsp(mine, yours):
allowed = ['가위', '바위', '보']
if mine not in allowed or yours not in allowed:
raise ValueError("잘못된 입력값입니다.")
try:
rsp('가위', '바')
except ValueError as e:
print(e)
해결 방법:
- 입력값 검증을 철저히 합니다.
- 사용자에게 적절한 피드백을 제공합니다.
4. StopIteration: 반복 종료 예외
원인: 반복(iteration) 중 StopIteration
이 발생하면 루프가 비정상적으로 종료될 수 있습니다.
예제 코드:
school = {'1반': [150, 156, 179, 191, 199], '2반': [150, 195, 179, 191, 199]}
try:
for class_number, students in school.items():
for student in students:
if student > 190:
print(class_number, '190을 넘는 학생이 있습니다.')
raise StopIteration # 잘못된 사용법
except StopIteration:
print('정상 종료')
해결 방법:
StopIteration
을 명시적으로 사용하기보다는break
를 활용하여 제어 흐름을 정리하는 것이 좋습니다.
for class_number, students in school.items():
for student in students:
if student > 190:
print(class_number, '190을 넘는 학생이 있습니다.')
break
5. ImportError: 모듈이 존재하지 않음
원인: 존재하지 않는 모듈을 임포트하려고 할 때 발생하는 오류입니다.
예제 코드:
try:
import your_module
except ImportError:
print('모듈이 없습니다.')
해결 방법:
pip install
을 통해 필요한 패키지를 설치합니다.- 가상 환경을 확인하고 필요한 모듈이 설치되어 있는지 점검합니다.
pip install your_module
6. 예외 처리를 보다 효율적으로
Python에서는 다양한 예외가 발생할 수 있으므로, 예외 처리를 효과적으로 구성하는 것이 중요합니다. 모든 예외를 잡는 것은 권장되지 않으며, 예상 가능한 예외에 대해 구체적인 핸들링을 적용해야 합니다.
try:
my_list = []
print(my_list[0]) # IndexError 발생 가능
text = 'abc'
number = int(text) # ValueError 발생 가능
except IndexError as e:
print(f'인덱스 오류 발생: {e}')
except ValueError as e:
print(f'값 오류 발생: {e}')
except Exception as e:
print(f'예기치 않은 오류 발생: {e}')
결론
Python의 에러는 발생 원인을 정확히 이해하고 올바른 예외 처리를 적용하면 보다 안정적인 프로그램을 만들 수 있습니다. 특히 실무에서는 에러 메시지를 로깅하고, 적절한 예외 처리를 적용하는 것이 중요합니다. 위에서 다룬 오류 유형과 해결 방법을 숙지하고, 더욱 견고한 코드를 작성해보세요!
답글 남기기