본문 바로가기
카테고리 없음

Python SystemExit 프로그램 종료 오류 대처법

by smartmove 2025. 6. 1.

Python SystemExit란?

Python에서 `SystemExit` 예외는 `sys.exit()` 함수가 호출되었을 때 발생합니다. 이 예외는 일반적인 오류가 아닌 **정상적 또는 비정상적인 프로그램 종료**를 의도적으로 유도하기 위한 것으로, 특별한 경우가 아니라면 예외로 처리할 필요는 없습니다. 하지만 `try-except` 문으로 포착하거나, 테스트 중 의도치 않게 프로그램이 종료되는 것을 막기 위해 대처가 필요할 수 있습니다.

1. SystemExit 예외가 발생하는 상황

  • `sys.exit()`을 호출했을 때
  • 스크립트 실행 중 오류 발생 시 직접 종료 처리를 위해 `exit()` 또는 `quit()` 사용 시
  • 외부 라이브러리 내부에서 `sys.exit()`을 호출한 경우

2. SystemExit 예시 코드


import sys

print("프로그램 시작")
sys.exit("종료합니다.")  # SystemExit 발생
print("이 문장은 실행되지 않습니다.")

3. SystemExit 대처 방법

3-1. try-except 문으로 예외 포착

테스트나 특정 상황에서 프로그램이 완전히 종료되지 않도록 `SystemExit`을 포착해 처리할 수 있습니다.

import sys

try:
    sys.exit("종료 요청됨")
except SystemExit as e:
    print(f"SystemExit 포착: {e}")

3-2. unittest 또는 pytest에서 sys.exit 방지

테스트 도중 `sys.exit()`이 호출되어 테스트 전체가 중단되는 것을 방지하기 위해 `pytest.raises(SystemExit)`이나 `mock`을 사용할 수 있습니다.

import sys
import pytest

def test_exit():
    with pytest.raises(SystemExit):
        sys.exit("테스트 중 종료")

3-3. sys.exit 사용 시 종료 코드 지정

`sys.exit(0)`은 정상 종료를 의미하며, `0`이 아닌 숫자는 오류 종료를 나타냅니다. 호출 위치에서 의미를 명확히 표현하는 것이 중요합니다.

if error_condition:
    sys.exit(1)  # 오류 종료
else:
    sys.exit(0)  # 정상 종료

3-4. 외부 라이브러리에서의 sys.exit 차단

서브프로세스나 외부 코드에서 `sys.exit()`이 발생할 가능성이 있을 때는 래핑하거나 프로세스 단위로 격리 실행하는 방법도 고려할 수 있습니다.

4. SystemExit과 KeyboardInterrupt의 차이

- `SystemExit`: 명시적으로 종료 요청 (개발자에 의해 `sys.exit()` 호출) - `KeyboardInterrupt`: 사용자가 Ctrl+C를 눌렀을 때 발생 둘 다 프로그램을 종료시키지만, 발생 원인이 다릅니다.

5. 요약 및 결론

  • `SystemExit`은 오류가 아닌 프로그램 종료 요청을 의미하는 예외입니다.
  • 테스트나 특정 로직에서 종료를 막고 싶다면 `try-except`로 포착할 수 있습니다.
  • `sys.exit()` 사용 시 종료 코드로 상태를 명확히 표현하세요.
  • 외부 코드나 테스트 중 예상치 못한 종료를 방지하는 방법도 중요합니다.
이 가이드를 통해 Python의 `SystemExit` 예외를 이해하고, 프로그램 종료를 제어하거나 방지할 수 있는 능력을 갖추게 됩니다.