모든 프로그래밍 언어에는 나름의 오류 처리 메커니즘이 있으며, 그중 일부 오류는 컴파일러나 인터프리터에 미리 코드화되어 있습니다. Python 역시 미리 정의된 표준 오류 코드에 연결된 다양한 오류들을 제공합니다. 이 글에서는 파이썬에 내장된 오류 번호(error number)와 오류 코드(error code)를 조회하는 방법을 알아보고, 실제로 오류 코드를 활용해 예외를 처리하는 예제까지 단계별로 살펴보겠습니다.
내장 오류 코드 확인하기
Python의 errno 모듈은 운영체제가 반환하는 시스템 오류 번호에 대응하는 기호 상수를 담고 있습니다. 아래 프로그램은 Python에 내장된 오류 번호와 그에 해당하는 오류 메시지 전체를 나열합니다. 여기서는 errno 모듈과 os 모듈을 함께 사용하며, os.strerror() 함수를 통해 오류 번호에 대응하는 설명 문자열을 얻습니다.
예제
import errno
import os
for i in sorted(errno.errorcode):
print(i, ':', os.strerror(i))
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
1 : Operation not permitted 2 : No such file or directory 3 : No such process 4 : Interrupted function call ………… ………..
출력 결과를 보면 오류 번호 1은 '허가되지 않은 작업(Operation not permitted)', 오류 번호 2는 '그런 파일이나 디렉터리가 없음(No such file or directory)'처럼 각 번호마다 고유한 의미가 매핑되어 있는 것을 확인할 수 있습니다.
오류 코드를 활용한 예외 처리
이번에는 실제로 오류가 발생했을 때 errno 값을 활용하는 방법을 살펴보겠습니다. 대표적인 예로 'No such file or directory'(오류 번호 2) 오류를 들 수 있습니다. 존재하지 않는 파일을 열려고 하면 IOError(OSError)가 발생하는데, 이때 예외 객체의 errno 속성을 검사하면 오류의 종류를 구분하여 상황에 맞게 처리할 수 있습니다.
예제
try:
file_name = open('Data.txt')
# errno 2는 'No such file or directory'를 의미합니다.
except IOError as e:
if e.errno == 2:
print(e.strerror)
print("인쇄하려는 파일을 찾을 수 없습니다.")
# 예외 처리 로직 작성
elif e.errno == 9:
print(e.strerror)
print("파일을 인쇄할 수 없습니다.")
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
No such file or directory 인쇄하려는 파일을 찾을 수 없습니다.
'Data.txt'라는 파일이 존재하지 않아 오류 번호 2에 해당하는 블록이 실행되었으며, e.strerror를 통해 시스템이 반환한 원본 오류 메시지도 함께 출력되었습니다. 참고로 오류 번호 9(EBADF)는 '잘못된 파일 디스크립터(Bad file descriptor)'를 의미합니다.
핵심 정리
- errno.errorcode : 오류 번호를 기호 상수 이름(예: EPERM, ENOENT)에 매핑하는 딕셔너리입니다.
- os.strerror() : 오류 번호를 사람이 읽기 쉬운 설명 문자열로 변환해 줍니다.
- e.errno / e.strerror : 예외 객체에서 실제 오류 번호와 설명을 확인할 수 있어, 오류 종류별로 분기 처리하는 견고한 코드를 작성할 수 있습니다.