코드의 버그를 나타내는 많은 프로그램 상태 검사를 배치합니다. 그런 경우 if not condition: raise MyException
보다 더 읽기 쉽기 때문에 assert condition
을 사용하고 싶습니다.-O (optimize) 플래그에도 불구하고 assert 유지
raise
대신 assert
을 사용하면 두 가지 문제점이 있습니다.
assert
그래서 나중에하게 잡기 제기 할 수있는 예외를 지정할 수 없습니다 하드 (AssertionError
를 잡는 것은 너무 많이 잡을 수있다).assert
은 -O 플래그가 인터프리터에 전달되면 비활성화됩니다.
제 환경에서는 버그가 발견되어 해결 될 때까지 결과를 폐기해야합니다. 따라서 위의 수표에 의해 제기 된 예외를 포착 할만한 포인트가 없습니다. 따라서 문제 # 1은 제 상황과 관련이 없습니다.
# 2 문제는 심각합니다. 내 수표가 생산 코드에 남아 있기를 바란다. 정확성이 내 환경의 성능보다 훨씬 중요하기 때문이다. 몇몇 사람들은 오늘 -O 플래그를 사용합니다. 그러나 어느 날 나 또는 다른 사람이 코드를 사용하는 것을 선호 할 수 있습니다 (예 : if __debug__
뒤의 코드를 숨기거나 -O가 실제로 코드를 최적화 할 수 있기 때문). 모든 assert
문은 프로덕션 코드에서 활성 상태로 유지되어야하므로 모든 assert
문을 다른 것으로 바꿔야합니다. -O 플래그에도 불구하고 assert
을 강제 종료 할 수있는 방법이 있습니까?
덧붙여서, assert의 원인이 된 라인으로부터의 변수 값을 인쇄 해, assert
의 동작을 커스터마이즈하려고하고 있습니다. 을 AssertionError
을 캐치하고, 추적 코드를 읽고, 관련 소스 코드를 찾고, 관련 줄에서 변수를 인쇄 한 다음 예외를 다시 발생시키는 자체 함수로 바꾸면됩니다. 문제가있는 사람이 있으면 알려 주시기 바랍니다.
을 당신이 심각한 오류 조건을 확인하는'assert'를 사용하는 가정뿐 아니라 일반 예외 조건? –
정확하게. 나는 특별한 입력을 잡기 위해 여전히 적절한 예외를 사용하고있다. - 나는 코드에서 실수를 잡기 위해서'assert' 만 사용하고있다. 내 특정 환경에서 코드의 실수는 치명적인 오류로 간주됩니다 (알려진 버그가 포함되어 있으면 프로덕션 코드가 실행되지 않음). – max
잘 보이지 않습니다. 어설 션을 제거하는 것은 분명히 -O 스위치의 "기능"입니다. http://stackoverflow.com/q/1273211/102937 –