이 책의 주요 논점은 코드의 예외 버전이 더 좋다는 것입니다. 자신의 오류 검사를 작성하려고 할 때 간과했을 수도있는 것을 잡아낼 수 있기 때문입니다.
나는이 진술이 출력이 정확한지 신경 쓰지 않는 매우 구체적인 상황에서만 사실이라고 생각합니다.
예외 를 제기 하는 것이 건전하고 안전한 방법이라는 데는 의심의 여지가 없습니다 . 프로그램의 현재 상태에 개발자 (개발자로서)가 처리 할 수 없거나 원하지 않는 것이있을 때마다 그렇게해야합니다.
그러나 귀하의 예는 예외 를 잡는 것에 관한 것 입니다. 예외를 발견하면 간과했을 수도있는 시나리오로부터 자신을 보호 할 수 없습니다 . 정확히 반대의 일을하고 있습니다. 이러한 유형의 예외를 초래할 수있는 시나리오를 간과하지 않았다고 가정하므로 예외를 잡을 수 있다고 확신합니다 (따라서 프로그램이 종료되지 않도록하십시오. 잡히지 않은 예외와 같이).
예외 접근 방식을 사용하면 예외가 표시되면 ValueError
줄을 건너 뜁니다. 기존의 비 예외 접근 방식을 사용하여의 반환 값 수를 세고 split
2보다 작 으면 한 줄을 건너 뜁니다. 기존의 오류 검사에서 다른 "오류"상황을 잊어 버렸을 수 있으므로 예외 접근 방식이 더 안전하다고 생각 except ValueError
하십니까?
프로그램의 특성에 따라 다릅니다.
예를 들어 웹 브라우저 나 비디오 플레이어를 작성하는 경우 입력 문제로 인해 포착되지 않은 예외로 인해 입력이 중단되지 않아야합니다. 종료하는 것보다 원격으로 감지 할 수있는 (엄격하게 말해서, 잘못하더라도) 출력하는 것이 훨씬 좋습니다.
정확성이 중요한 응용 프로그램 (예 : 비즈니스 또는 엔지니어링 소프트웨어)을 작성하는 경우 이는 끔찍한 접근 방식입니다. 발생하는 시나리오를 잊어 버린 경우 ValueError
최악의 상황은 알 수없는이 시나리오를 자동으로 무시하고 단순히 줄을 건너 뛰는 것입니다. 이것이 소프트웨어에서 매우 미묘하고 값 비싼 버그가 발생하는 방식입니다.
ValueError
이 코드에서 볼 수있는 유일한 방법 split
은 두 값 대신 하나의 값만 반환하는 것입니다. 그러나 만약 당신의 print
진술이 나중에 ValueError
어떤 조건 하에서 일어나는 표현을 사용하기 시작 한다면 어떨까요? 이로 인해 누락 된 :
것이 아니라 print
실패 하기 때문에 일부 줄을 건너 뛸 수 있습니다. 이것은 내가 이전에 언급 한 미묘한 버그의 예입니다. 아무것도 알지 못하고 일부 줄을 잃어 버립니다.
내 권장 사항은 잘못된 출력을 생성하는 것이 종료하는 것보다 나쁜 코드에서 예외를 잡아내는 것을 피하는 것입니다. 그러한 코드에서 예외를 잡을 수있는 유일한 시간은 진정으로 사소한 표현이있을 때뿐이므로 가능한 각 예외 유형을 유발할 수있는 원인을 쉽게 추론 할 수 있습니다.
예외 사용의 성능 영향과 관련하여 예외가 자주 발생하지 않는 한 (파이썬에서는) 사소합니다.
예외를 사용하여 일상적으로 발생하는 조건을 처리하는 경우 경우에 따라 막대한 성능 비용이 발생할 수 있습니다. 예를 들어, 일부 명령을 원격으로 실행한다고 가정하십시오. 명령 텍스트가 최소한 최소 유효성 검사 (예 : 구문)를 통과하는지 확인할 수 있습니다. 또는 원격 서버가 명령을 구문 분석하고 문제를 발견 한 후에 만 예외가 발생할 때까지 기다릴 수 있습니다. 분명히 전자는 수십 배 더 빠릅니다. 또 다른 간단한 예 : 나누기를 실행 한 다음 ZeroDivisionError 예외를 잡는 것보다 숫자가 0 ~ 10 배 빠른지 확인할 수 있습니다.
이러한 고려 사항은 잘못된 형식의 명령 문자열을 원격 서버로 자주 보내거나 나눗셈에 사용하는 값이 0 인 인수를받는 경우에만 중요합니다.
참고 : except ValueError
그냥 대신 사용한다고 가정합니다 except
. 다른 사람들이 지적했듯이 책 자체가 몇 페이지에 나와 있듯이 bare를 사용해서는 안됩니다 except
.
또 다른 참고 사항 : 적절한 비 예외 접근 방식은에 split
대한 검색 대신에 의해 반환되는 값의 수를 계산하는 것입니다 :
. 후자는 작업을 반복 split
하고 실행 시간을 거의 두 배로 늘리기 때문에 너무 느립니다 .