python - 예외에서 루프를 종료하지만 모든 예외 유형을 다시 발생시키지 않는 방법은 무엇입니까?

기사 출처 python exception-handling

KeyboardInterrupt에서 종료하려는 루프가 있습니다.

while True:
    try:
        do_stuff()
    except KeyboardInterrupt:
        cleanup()
        break
    except Exception as e:
        cleanup()
        raise e


이것은 잘 작동하지만 이중 cleanup()는 나에게 매우 부정한 것처럼 보입니다. 중복 된 코드가 마음에 들지 않습니다. 대신 컨텍스트 관리자를 사용해 보았지만 불필요한 복잡성이 많이 발생하고 파일 크기가 거의 두 배가되었습니다.

내 의도를 더 깔끔하게 표현할 수있는 방법이 있습니까?
finally 키워드는 정확히 당신이 찾고있는 것입니다. The doc on errors and exceptions는 사용법을 설명합니다.


finally 절은 예외 발생 여부에 관계없이 항상 try 문을 떠나기 전에 실행됩니다.




정리가 루프를 떠날 때만 발생해야하는 경우 루프를 교체하고 시도하는 것이 좋습니다.

try:
    while True:
        do_stuff()
except KeyboardInterrupt:
    pass
finally:
    cleanup()

이 질문에 대해 Stack Overflow에서 비슷한 토론을 찾았습니다: https://stackoverflow.com/questions/13604155/

관련 기사
python - 특수 문자를 고려하지 않고 대소 문자를 구분하지 않고 문자열 목록을 정렬하는 방법
python - numpy.nextafter () float에 추가하면 예기치 않은 결과가 반환됩니다.
python - Python에서 베어 함수 객체가 유효한 코드 인 이유는 무엇입니까? [닫은]
python - 최소 차 제곱합을 찾는 알고리즘
python - 한 번에 여러 파일 쓰기
python - Simplegui 가져 오기 문제
python - 파이썬의 백 슬래시 이스케이프 문자 이해
python - 지정된 바이트 오프셋에서 파일에서 행 가져 오기
python - REST API의 일반 (HTML이 아닌) 오류 페이지
python - 비 루트 사용자로서의 감독자 [닫힘]