2009-12-26 4 views

답변

13

파이썬의 빌트인 예외 클래스를 서브 클래스화할 수 있다는 것을 기억하십시오. (그리고 TypeError은 여기에 올릴 내장 된 예외 클래스가 될 것입니다. 이것은 인수의 수가 서명과 일치하지 않으면 파이썬이 제기하는 것입니다. 서명에 *a 또는 **k이없는 경우). 나는 모든 패키지 나는 그런 문제 상황을 감지 할 때

class WrongNumberOfArguments(thispackage.Error, TypeError): 

그럼, raise WrongNumberOfArguments을 거라고 :, 필요에 따라 그 class Error(Exception) 자신의 다음 특정 예외가 적절하게 상속 증식 할 수 예컨대을 정의 보내고 있습니다.

이런 식으로이 패키지를 알고있는 모든 발신자는 패키지와 관련된 오류를 처리해야하는 경우 thispackage.Error을 잡을 수 있으며 다른 발신자 (아마도 전화 체인에서 더 높은 전화)가 더 일반적인 TypeError "함수 호출에서 사용 된 인수의 잘못된 번호"와 같은 오류를 처리합니다.

+0

다중 상속을 멋지게 사용하는 예입니다. 감사. –

3

나는 특정한 것을 만들 것이다. 당신이 만든 특수한 상황이므로 catch하고 특별한 예외를 처리 할 수 ​​있습니다 :)

4

프로그래머가 오류라고 말한 것처럼 (AssertionError :

)
def two(**kwargs): 
    assert len(kwargs) == 2, "Please only provide two args" 

BTW, 이름이 지정된 인수가 3 개인 경우 ** kwargs는 이상한 방법입니다. 수 있습니다 더 자연 :

def two(a=None, b=None, c=None): 
    pass 
0

나는 ValueError를, 또는 그 서브 클래스 사용합니다 : A가 내장 된 작동 또는 기능 권리 유형 있지만 부적절한 값을 갖는 인수를 수신하고 상황이 때 "제기를 IndexError와 같은보다 정확한 예외로 설명되지 않습니다. "

정확히 2가 필요한 경우 3 또는 1 값을 전달하면 모든 인수를 단일 튜플로 간주하는 경우 기술적으로 부적절한 값이됩니다 ... 적어도 내 의견으로는! :)

11

왜 파이썬이하지 않는가?

>>> abs(1, 2, 3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: abs() takes exactly one argument (3 given) 
0

맞춤 예외를 권장합니다. 좋아요 :

class NeedExactlyTwo(ValueError): 
    pass 

코드에서 raise NeedExactlyTwo 수 있습니다.

이 기능을 문서화 문자열에 문서화하십시오.

관련 문제