[파이썬] shutil 파일 및 디렉토리 작업 중 예외 처리 전략

shutil은 Python에서 파일 및 디렉토리 작업을 수행하는 데 사용되는 표준 라이브러리입니다. 파일 복사, 이동, 삭제 등과 같은 작업을 간단하게 처리할 수 있어 많은 개발자들이 자주 사용합니다. 그러나 파일 및 디렉토리 작업은 예기치 않은 예외 상황이 발생할 수 있으므로 이러한 예외를 처리하는 전략을 갖는 것이 중요합니다.

이번 블로그 포스트에서는 shutil을 사용할 때 파일 및 디렉토리 작업 중 발생할 수 있는 예외를 처리하는 전략을 소개하겠습니다.

1. 예외 처리란?

예외 처리는 코드 실행 중에 발생하는 예외 상황을 처리하는 방법입니다. shutil을 사용하여 파일 및 디렉토리를 조작하는 경우, 다양한 이유로 예외가 발생할 수 있습니다. 예를 들어, 파일이 이미 존재하는 경우, 파일이 없는 경우, 권한이 없는 경우 등입니다. 이러한 예외 상황을 예측하고 적절히 처리하는 것은 안정적인 코드를 작성하는데 중요합니다.

2. try-except 문 사용하기

shutil을 사용할 때 예외 처리를 위해 try-except 문을 사용할 수 있습니다. try 블록에는 예외가 발생할 수 있는 코드를 넣고, 예외가 발생하는 경우에 대한 처리를 except 블록에 작성합니다. 이렇게 작성된 코드는 예외가 발생해도 프로그램이 비정상적으로 종료되지 않고 정상적으로 실행될 수 있습니다.

import shutil

try:
    shutil.copy('source.txt', 'destination.txt')
except IOError as e:
    print("파일 복사 중 오류가 발생했습니다:", str(e))

위의 예시에서는 shutil.copy를 사용하여 source.txt 파일을 destination.txt 파일로 복사하는 코드입니다. 그러나 만약 source.txt 파일이 존재하지 않는다면 IOError가 발생할 수 있습니다. 이 경우 except IOError를 사용하여 해당 예외를 처리하고 사용자에게 오류 메시지를 출력합니다.

3. 여러 예외 처리하기

일반적으로 파일 및 디렉토리 작업 중에는 여러 가지 예외 상황이 발생할 수 있습니다. 예를 들어, 파일이 존재하지 않는 경우와 권한이 없는 경우에 대해서 다르게 처리해야 할 수 있습니다. 이러한 다양한 예외 상황에 대해 각각 예외 처리를 하는 것이 좋습니다.

import shutil

try:
    shutil.copy('source.txt', 'destination.txt')
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")
except PermissionError:
    print("권한이 없습니다.")
except Exception as e:
    print("오류가 발생했습니다:", str(e))

위의 예시에서는 FileNotFoundErrorPermissionError를 별도로 처리하고, 그 외의 예외에 대해서는 Exception을 사용하여 처리합니다. 이렇게 명확하게 예외를 처리하면 프로그램이 어떤 예외 상황에서 동작하는지 파악하기 쉬워집니다.

4. 예외 처리와 로깅

예외 처리는 사용자에게 오류 메시지를 출력하는 것 이상의 역할을 수행할 수 있습니다. 예외를 로깅하여 로그 파일에 저장하거나 로깅 시스템에 보고하는 등의 작업을 추가할 수 있습니다. 이를 통해 오류가 발생한 원인을 추적하고 디버깅하는 데 도움을 줄 수 있습니다.

import shutil
import logging

logger = logging.getLogger('example_logger')
logger.setLevel(logging.ERROR)
log_file = 'error.log'
file_handler = logging.FileHandler(log_file)
logger.addHandler(file_handler)

try:
    shutil.copy('source.txt', 'destination.txt')
except Exception as e:
    logger.error("파일 복사 중 오류가 발생했습니다: " + str(e))

위의 예시에서는 logging 모듈을 사용하여 logger를 설정하고 파일 핸들러를 추가합니다. 예외가 발생하는 경우 logger.error를 사용하여 오류 메시지를 로깅합니다. 이렇게 설정된 로거는 error.log 파일에 오류 메시지를 기록하게 됩니다.

5. raise 문을 사용한 예외 발생하기

shutil 함수를 호출한 후에 예외가 발생하는 경우, 해당 예외를 단순히 처리하는 것 외에도 프로그램의 흐름을 제어할 수 있습니다. raise 문을 사용하여 예외를 명시적으로 발생시킬 수 있습니다. 이는 특정 조건에 따라 예외를 발생시켜 프로그램의 실행을 중단시키는 등의 작업을 수행할 수 있습니다.

import shutil

try:
    shutil.copy('source.txt', 'destination.txt')
except FileNotFoundError:
    print("파일을 찾을 수 없습니다.")
    # 파일을 찾을 수 없는 경우, 예외를 발생시킴.
    raise

위의 예시에서는 FileNotFoundError를 처리하고 있지만, 예외가 발생한 경우에 별도로 예외를 발생시키고 있습니다. 이렇게 하면 원래 예외에 대한 추가적인 작업을 수행할 수 있습니다. 예를 들어, 해당 예외를 다른 모듈로 전달하여 추가적인 처리를 하도록 할 수도 있습니다.

마무리

shutil을 사용하여 파일 및 디렉토리 작업을 수행할 때 예외 처리를 활용하는 것은 안정적인 코드를 작성하는 데 중요한 요소입니다. try-except 문을 사용하여 예외를 처리할 수 있으며, 여러 종류의 예외에 대해 각각 처리하는 것이 좋습니다. 또한, 로깅을 통해 예외를 기록하고 추적하는 것도 유용한 방법입니다. 예외를 명시적으로 발생시키는 경우에는 raise 문을 사용하여 프로그램의 실행 흐름을 제어할 수 있습니다.