파이썬 공식 문서에 따르면 SystemExit는 Exception 클래스의 하위 클래스가 아닙니다. 대신 모든 내장 예외의 최상위 클래스인 BaseException을 직접 상속받습니다.
따라서 일반적인 방식처럼 except Exception:으로 예외를 처리하면 SystemExit는 잡히지 않습니다. 이 경우 BaseException을 사용해야 코드가 의도대로 동작합니다.
BaseException으로 처리하는 예제
try:
raise SystemExit
except BaseException:
print("It works!")출력 결과
It works!
왜 SystemExit는 Exception이 아니라 BaseException을 상속할까?
SystemExit가 StandardError(구버전)나 Exception이 아닌 BaseException을 상속하는 데에는 명확한 이유가 있습니다. 프로그램 종료 신호가 일반적인 오류 처리 코드(except Exception:)에 실수로 가로채지 않도록 하기 위해서입니다.
예를 들어 sys.exit() 호출 시 발생하는 SystemExit가 광범위한 예외 처리문에 걸려 프로그램이 종료되지 못하는 상황을 방지할 수 있습니다.
더 나은 방법: SystemExit를 직접 처리하기
BaseException은 KeyboardInterrupt 등 모든 최상위 예외까지 함께 잡아버리기 때문에 남용하면 좋지 않습니다. 필요한 경우에는 아래와 같이 SystemExit를 명시적으로 지정하는 것이 훨씬 깔끔하고 안전한 방법입니다.
예제
try:
raise SystemExit
except SystemExit:
print("It works!")출력 결과
It works!
정리
SystemExit는Exception이 아닌BaseException의 하위 클래스입니다.except Exception:으로은SystemExit를 잡을 수 없습니다.- 프로그램 종료 로직을 제어해야 한다면
except SystemExit:로 직접 명시하는 것이 가장 좋습니다. except BaseException:은 모든 예외를 포괄하므로 특수한 경우에만 사용해야 합니다.