2011-09-21 3 views
3

standard exceptions 중 어느 것이에서 NotReadyException을 유도하는 것이 가장 적절할 것, 내가 지금개체가 올바른 상태가 아닙니다. 어떤 예외가 적절한가?

class Rocket(object): 
    def __init__(self): 
     self.ready = False 

    def prepare_for_takeoff(self): 
     self.ready = True 

    def takeoff(self): 
     if not self.ready: 
      raise NotReadyException("not ready!") 
     print("Liftoff!") 

을 말해봐? self의 상태/값이 잘못되었으므로 ValueError이 될까요?

답변

6

Now, which of the standard exceptions would be most appropriate to derive NotReadyException from?

Exception

아무것도하지 엉망 마십시오.

http://code.google.com/p/soc/wiki/PythonStyleGuide#Exceptions

예외 처리에 대한 사용 사례는 무엇입니까?

예를 들어 ValueError에서 예외를 파생시킨 경우 except ValueError:을 사용하는 처리기를 작성하면 두 예외를 모두 catch하고 정확히 동일한 방식으로 처리 할 수 ​​있습니까? 있을 것 같지 않게.

ValueError은보다 구체적인 예외가 적절하지 않을 때 포괄적입니다. 귀하의 예외는 매우 구체적입니다.

이와 같은 응용 프로그램 관련 예외가있는 경우에는 기본 제공 예외가있는 유용한 의미를 공유 할 확률이 낮습니다. 실제로 새 예외와 기존 예외를 단일 처리기에 결합 할 확률은 매우 낮습니다.

애플리케이션 관련 예외와 일반적인 예외를 결합하는 유일한 방법은 일부 캐치 올 로거에서 except Exception:을 사용하는 것입니다.

+0

내 유스 케이스는 일종의 기본 제공 예외를 던지는 것으로 내 인터페이스를 문서화하는 것을 선호하지만 실제로 하위 유형을 포기할 자유가 있으므로 필요할 때 "개인적으로"보다 세밀하게 처리 할 수 ​​있습니다. . 귀하의 충고는 여전히 적용됩니까? 라이브러리 별 예외 클래스로 인터페이스를 혼란스럽게하고 싶지 않습니다. –

+0

@larsmans : 표준 조언은 외부 API 목적을위한 모듈에서 하나의 응용 프로그램 특정 예외입니다. 종종 "Error"와 같은 일반적인 이름으로 클라이언트는 except module.Error :'를 할 수 있습니다. –

+0

@larsmans : 문서의 유스 케이스가 중요하지 않습니다. 취급을위한 유스 케이스가 지표입니다. 당신이 예외와 'ValueError' **를 정확히 처리하지 않는다면 같은 일이 아닙니다. 클래스 정의는 구조와 동작을 캡슐화합니다. 예외 구조는 대개 흥미롭지 않습니다. 예외 동작은 흥미로운 사용 사례입니다. 그리고 그것은 다른 무엇보다도'except' 조항으로 귀결됩니다. –

2

나는 방금 Exception에서 파생되었습니다. ValueError을 붙잡는 프로그래머는 당신의 NotReadyException을 또한 붙잡는다 확실히 놀랠지도 모르다.

이와 유사한 유형의 주와 관련된 예외를 정의 할 경우 '모두를 잡을 수 있으면 편리 할 것이므로 StateError 예외를 정의한 다음 NotReadyException을 파생시킵니다.

+0

... 내가 'ValueError'를 던지는 것으로 문서화하지 않았다면, 맞습니까? –

+2

나는 생계를위한 문서를 쓴다. 심지어 나는 그것을 읽는 사람이 거의 없다는 것을 알고있다. :-) "놀랍지 않은 원칙"에는 독서 문서가 포함되어 있지 않습니다. – kindall

관련 문제