카테고리 없음
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` 예외를 이해하고, 프로그램 종료를 제어하거나 방지할 수 있는 능력을 갖추게 됩니다.