sys.exit ()가 잡히는 것을 막는 SystemExit 예외를 방지하는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/173278

문제

문서는 sys.exit ()를 호출하면 외부 레벨에서 잡을 수있는 SystemExit 예외를 제기한다고 말합니다. 테스트 케이스 내부에서 명확하고 의심 할 여지없이 종료하고 싶은 상황이 있지만 UnitTest 모듈은 SystemExit을 잡아 출구를 방지합니다. 이것은 일반적으로 훌륭하지만, 내가 처리하려는 특정 상황은 테스트 프레임 워크에서 비 테스트 데이터베이스를 가리키도록 구성되어 있음을 감지 한 것입니다. 이 경우 종료하고 추가 테스트가 실행되는 것을 방지하고 싶습니다. 물론 Unittest가 SystemExit을 갇히고 행복하게 계속 이어지기 때문에 저를 막아냅니다.

내가 지금까지 생각한 유일한 옵션은 CTYPES 또는 유사한 출구 (3)를 직접 사용하는 것입니다. 그러나 이것은 정말 간단해야 할 일에 대한 꽤 치명적인 해킹처럼 보입니다.

도움이 되었습니까?

해결책

전화해도됩니다 os._exit() 예외를 던지지 않고 직접 종료하려면 :

import os
os._exit(1)

이것은 모든 파이썬 셧다운 로직을 우회합니다. atexit 모듈,이 상황에서 피하려는 예외 처리 로직을 통해 실행되지 않습니다. 인수는 프로세스에 의해 반환 될 종료 코드입니다.

다른 팁

Jerub가 말했듯이 os._exit(1) 당신의 대답입니다. 그러나 우회를 고려합니다 모두 포함 된 청소 절차 finally: 블록, 닫는 파일 등을 실제로 피해야합니다. 실제로 모든 비용으로 피해야합니다. "더 안전한"방법을 사용해야합니까?

문제가 있다면 SystemExit 외부 레벨 (즉, 단위)에서 잡히면 외부 레벨이 되십시오! 메인 코드를 시도/블록을 제외하고 SystemExit을 잡고 OS._exit에 전화하십시오. 그리고 거기! 이렇게하면 전화 할 수 있습니다 sys.exit 일반적으로 코드의 어느 곳에서나 최상위 수준으로 거품을 내고 모든 파일을 우아하게 닫고 모든 정리를 실행하고 실행합니다. 그 다음에 os._exit 호출.

"비상"출구를 선택할 수도 있습니다. 아래 코드는 그러한 접근법의 예입니다.

import sys, os

EMERGENCY = 255  # can be any number actually

try:
    # wrap your whole code here ...
    # ... some code
    if x: sys.exit()
    # ... some more code
    if y: sys.exit(EMERGENCY)  # use only for emergency exits
    # ...
except SystemExit as e:
    if e.code != EMERGENCY:
        raise  # normal exit, let unittest catch it
    else:
        os._exit(EMERGENCY)  # try to stop *that*, sucker!
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top