파이썬에서 예외를 언제 서브 클래 싱해야합니까?


10

내 코드에는 예외를 제기하는 약 7 곳이 있습니다. 이러한 예외는 모두 동일하게 처리됩니다. 오류를 로그 파일에 인쇄하고 소프트웨어 상태를 기본값으로 되 돌린 후 종료합니다.

코드를 검토하는 동안 내가 중요하게 생각하는 수석 엔지니어는 이러한 예외를 모두 서브 클래 싱해야한다고 말했다. 그의 주장은 미래에 우리는 예외를 다르게 처리하기를 원할 것이고 더 쉬울 것입니다.

내 주장은 현재 코드를 어지럽히고 예외를 다르게 처리할지 여부를 알지 못하므로 코드를 간결하게 남겨 두어야하며 시간이 오면 그때만 서브 타입을 지정해야합니다 .

각 사건에 대한 논쟁을 듣고 싶습니다.


2
YAGNI ... 지금은 필요하지 않으며 언제든지 어려움없이 나중에 추가 할 수 있습니다.
Robert Harvey

예가 있습니까? 방금 양육하고 Exception, 예를 들어, 이상의 특정 내장 된 오류?
jonrsharpe

그냥 예외를 제기 ( "구체적인 설명")
Ezra

@Ezra는 최소한 더 적합한 내장 예외가 있는지 확인해야합니다 ( docs.python.org/2/library/exceptions.html 참조 ).
jonrsharpe

답변:


8

네가 옳아

당신의 주장은 이미 Robert Harvey에 의해 언급되었습니다. 특히 나중에 추가하기 쉽기 때문에 지금 필요하지 않은 코드는 추가하지 마십시오.

검토 자도 옳습니다

반면에 검토 자의 요점도 이해할 수 있습니다.

  • 제네릭을 반환하는 Exception()것은 호출자에게 큰 도움이되지 않습니다. 예외 설명은 진행 상황을 인간에게 알려주지 만, 프로그래밍 방식으로 예외를 다르게 처리하는 것은 불가능할 수 있습니다. 코드를 사용하는 개발자는 무언가를 깨뜨릴 까봐 두려움을 포함하여 예외 유형을 변경하는 것을 꺼려 할 수 있습니다 .

    지금 사용자 정의 예외추가하는 것은 그리 어렵지 않습니다 .

    class MyCustomException(Exception):
        pass
    

    당신이 필요한 전부입니다. 그것은 두 줄의 코드입니다 (하나의 파일에 커스텀 예외를두면 별도의 파일을 만들 필요조차 없을 수도 있습니다).

  • 코드 자체가 더 읽기 쉽고 읽기 쉽습니다.

    if price < self.PriceMinValue:
        raise OutOfRangeException("The price is inferior to zero.")
    

    다음과 비교할 때 약간 더 읽기 쉽습니다.

    if price < self.PriceMinValue:
        raise Exception("The price is inferior to zero.")
    

    예외 유형의 표시로 인해 :

    • 두 번째 코드에서는 설명을 읽고 가격이 범위를 벗어난 것 같아요 (또는 아닐 수도 있습니다. 리베이트와 같이 가격이 음수가 될 수있는 경우가 있습니까?)

    • 첫 번째 코드에서 유형을 살짝 보면 오류에 대한 즉각적인 표시가 나타납니다. 가격에 허용되는 값 세트가 있고 현재 값이이 세트를 벗어난 것 같습니다.

그래서?

그래서:

  • 두 가지 방법 모두 유효합니다. 사용자 정의 유형이 필요하지 않을 때 예외를 서브 클래 싱하지 않으면 옳습니다. 예외를 처리하는 데 비용이 들지 않고 나중에 유용 할 수 있기 때문에 예외를 서브 클래스로 만들면 옳습니다.

  • 팀과 일관성을 유지하십시오. 팀에서 사용자 지정 예외를 광범위하게 사용하는 경우 예외를 사용하십시오.


2
그러나 행복한 매체가 raise ValueError('The price is less than zero')있습니다. 이것은 기본보다 더 구체적 Exception이지만 소란이 없습니다.
jonrsharpe

팀이있는 경우, 팀이없는 경우, 팀과 함께 "일관성있는"간단한 진술을 +1하십시오.
Styne666
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.