2014-07-24 7 views
2

사용자가 존재하지 않을 수있는 데이터 포인트에 도달하기 위해 잘못된 데이터를 제공 할 수있는 상황이 있습니다. 현재 이러한 문제가 발생할 때 제기되는 오류 유형은 분명하지 않거나 간단합니다.파이썬에서 특정 예외를 서브 클래 싱하는 단점들?

내 API에서는 UI에서 잡으려고하는 오류를 만들려고합니다. (또는 UI 프레임 워크가 사용자에게 테스트하고 알 수 있도록 직접보고하여 처리하도록합니다.) :

class DataError(ValueError): 
    ''' 
    raise this error with a message of what was wrong, 
    will also be caught when catching general ValueErrors 
    or other Exceptions that ValueError subclasses 
    ''' 

그리고 사용 :

if user_input not in accepted_values: 
    raise DataError('bad user_input: {0}'.format(user_input)) 

내 접근 방식에 대해 오히려 자기 의견을 고집합니까, 나는 오히려 공격 할 수없는 코드를 원한다. 다른 사람들을 숨기지 않고이 특별한 예외를 잡을 수 있기 때문에 나는 위로에 대해서 알고 있습니다. 그러나 나는 단점을 생각할 수 없다.

내 오류 메시지를 단지 ValueError으로 제기하는 것과는 대조적으로이 작업의 단점은 무엇입니까?

+1

새로운 예외 유형을 만들려면 어떻게해야합니까? 그 외에도, 귀하의 응용 프로그램에 대해보다 구체적인 예외 유형을 생성하는 것이 항상 좋은 생각입니다. 사용자가'ValueError'와는 달리'DataError'를 다룰 생각이 없다면 과도한 것으로 생각할 수도 있습니다. – dano

+1

당신이 나에게 묻는다면 진짜 단점은 없다. 이것이 바로가는 길이다. 특정 예외는 일반적인 의미보다 훨씬 의미있는 역 추적 (및 코드)을 만듭니다. 이와 비슷한 라이브러리가 인기있는 예제는 ['requests.exceptions'] (https://github.com/kennethreitz/requests/blob/master/requests/exceptions.py)를 참조하십시오. –

+0

또한 SQLAlchemy ([code] (https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/exc.py)/[docs] (http://docs.sqlalchemy.org/en/)를 참조하십시오. rel_0_9/core/exceptions.html)). 덧붙여서 ['DataError'] (http://docs.sqlalchemy.org/en/rel_0_7/core/exceptions.html#sqlalchemy.exc.DataError)도 나와 있습니다. 마이크에게 충분하다면, 나에게 충분하다. –

답변

2

사용자 정의 예외를 작성하는 것은 거의 항상 올바른 방법입니다.

  1. 이 오류가 표준 라이브러리의 오류로 정확히 대응 하는가 : 그렇게 말한다면, 몇 가지 사소한 잠재적 인 단점은 예외를 서브 클래 싱 할 수 있습니까? 예를 들어, dict처럼 보이는 객체를 구현하면 KeyError을 던지기 만하면됩니다.

  2. 옳은 일을 하위 클래스로 분류하고 있습니까? 예를 들어, ValueError을 잡는 사람은 DataError을 잡을 것입니다. 유스 케이스에 따라 적절하지 않은 경우가있을 수 있습니다.

  3. 서브 클래 싱하는 예외는 추가 기능을 제공합니까? 그것은 클래스입니다, 그것은 모든 종류의 메소드를 가질 수 있습니다. 예외를 서브 클래스 화하는 경우, 모든 메소드가 오류 상황에 적합한 지 확인해야합니다.

경우에 따라 예외가 적용되지 않을 수도 있습니다. 더 적합 할 'no value'결과 (예 : None 또는 [])가 있습니까?

+0

1) 2) 예. 3) 아닙니다.하지만 대답에 감사 드리며 잠재적 인 단점이 있습니다! 당신에게 플러스 하나! –

2

나는 맞춤 예외가 있습니다. ValueError과 오류 메시지를 사용하는 단점은이 특정 오류를 잡으면 사용자 정의 예외를 잡는 대신 문자열 일치를 수행해야한다는 것입니다. ValueError의 하위 클래스를 생성하면 구현에 버그가 있음을 쉽게 알 수 있습니다.

또한 ValueError은 실제 적용 범위가 매우 모호합니다. 내장 된 작동 또는 기능이 올바른 유형 그러나 부적절한 값을 가지고, 상황 가

아마도 더 정확한 예외 설명하지 않은 것 인자가 수신 된 경우에 발생

하여 DataError에는 유효한 값의 정의 된 범위가 있습니다. 이 경우보다 구체적이므로 명확하게 더 적절합니다.

+0

의견을 보내 주셔서 감사합니다. 내 확인 편견을 도우려고했지만, 정말 일사량의 단점을 갖기 위해 노력하고있었습니다. –

관련 문제