2009-11-10 10 views

답변

13

값이 인 경우은 정의 상 열거 형 값과 일치해야하며 사용자가 다른 값을 받았으므로 그 값은 잘못된 것입니다.

하지만 이제 문맥을 고려해야합니다.

이 메서드는 비공개이며 클래스 라이브러리 또는 응용 프로그램의 멤버 만 액세스 할 수 있습니까? 그렇다면 처음부터 발생해서는 안되는 코딩 오류입니다. 주장하고 실패하십시오.

반면 공개 또는 보호 된 방법이고 라이브러리를 사용하는 클라이언트가 액세스 할 수있는 경우 의미있는 메시지 (잘 알려진 예외 유형)를 던져야합니다.

프레임 워크에서 열거 형의 범위가 선택되지 않았 음을 기억해야합니다. 메소드에 Environment.SpecialFolder 유형의 매개 변수가 필요하다고 지정할 수 있습니다. 그러나 그것은 어떤 32 비트 정수 값을 받아 들일 것입니다.

따라서, 귀하의 방법이 공공 소비를위한 것이라면, 즉, 예, 반드시 throw하십시오. 일반 소비가 아닌 경우 Assert.

+1

+1 잘 말한 적이. 예기치 않은 값이 자신의 것으로부터 나온다면 Assert하고 실패합니다. 다른 한편, 코드를 사용하는 다른 사람이 온다면 예외를 throw하고 호출 코드에 복구 기회를 주어야합니다. –

+2

왜 Assert는 던지기보다 낫다. 어쩌면 그 조건은 드문 경우이며 개발자가 충돌하지 않을 수도 있고 릴리스 빌드 (Assert가 컴파일되지 않은)를 사용하는 테스터 만 공격을받으며 오류는 삼킨다. 오류를 삼키는 것이 낫지 만, 충돌하지 말고 스택 추적으로 충돌하는 대신 잘못된 것을 디버깅하기가 어렵습니까? –

+0

또 다른 질문은 다른 회사에서 API를 작성하지 않으면 얼마나 많은 오류 검사가 코드에 넣을 가치가 있는지입니다. 짧은 코드는 오류 검사로 인해 각 메서드 크기가 두 배로되는 코드보다 읽기 쉽다고 생각합니다. 그렇지 않니? –

0

정말 특정 프로세스에 따라 다르지만 예, 무언가가 존재하지 않을 경우 기본 : 대소 문자로 응답하는 것이 좋습니다.

2

합리적인 선택처럼 들립니다.

개인적으로 새로운 유형의 예외 (아마도 InvalidEnumException)를 만들거나 지원 팀에 이해할 수있는 다른 이름을 지정하고이를 버립니다.

+2

나는 많은 기존의 예외 유형 중 하나를 직접 시도하고 재사용하려고합니다. http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx – Joe

+0

동의하지 않았기 때문에 downvoted 동의합니다. 사용자 정의 예외 유형 –

1

코드가 기본값에 도달하고 예상하지 못했기 때문에 코드에있는 내용이 생각한대로 작동하지 않기 때문에 ApplicationException을 던질 것입니다.

+0

ApplicationException을 사용하면 안된다. –

+0

나는 그 –

0

나는 최소한 Debug.Fail()을 넣어야한다고 말하고 싶습니다.

메소드를 진행할 수없는 경우를 대비하여 예외를 throw해야합니다. 그러나 열거 형 값을 문자열 표현으로 변환하는 것과 같은 경우 대신 경고 문자열을 반환 할 수 있습니다. 명백한 실수로 인해 제품이 사용자에게 충돌을 일으키지 않으며, 해결 방법이있을 것이며 모든 사용자가 만족할 것입니다.

4

아마도 NotImplementedException이 아니지만 ArgumentException입니다. 정말로 당신이 그것을 사용하고있는 곳에 달려 있습니다.

1

정말 사용 사례에 따라 다릅니다. 통합 초기에 예외가 발생하면 도움이 될 것입니다. 라이브러리 사용자는 오류를 즉시 알 수 있습니다.

0

예외가 발생하면 어떻게 될까요? 어떤 문맥에서 switch 문이 실행됩니까? 그 상황이 일어날 것인가? 런타임에 프로덕션 코드에서 발생해야합니까? 당신의 단위 테스트가이 상황을 다루고 있습니까? 그렇다면 아마도 어설트가 더 좋을 것입니다.

0

먼저 알려진 경우를 벗어나는 값을 얻었 으면 무엇을 의미하는지 고려해야합니다. 즉, 전환되는 변수는 무엇을 나타 냅니까? 그런 다음 실제로 발생하는 상황에 맞는 예외 유형을 사용할 수 있습니다.

5

정말 다릅니다.

  • NotImplementedException은 저와 같은 것입니다. 누군가가 나중에 코드를 완성하게 될 것입니다. 그러나 나는 그것이 발생해서는 안되는 기본 사건의 경우라고 생각하지 않습니다.

  • 개체의 상태를 확인할 때 InvalidOperationException을 고려해보십시오. 귀하의 방법은 기존의 경우에만 작동하도록 설계되었습니다.

  • 입력 매개 변수를 구별 할 때 ArgumentException이 항상 적절합니다.

  • 다른 경우 나는 NotSupportedException을 선호합니다. 플랫폼이나 버전에 문제가 있음을 나타냅니다. 그리고 호환되지 않는 버전의 코드는 발생하지 않아야하는 스위치의 기본 사례가 발생할 때 문제의 진정한 근원입니다.

+0

흥미로운 대답입니다. 당신의 동기/추론은 무엇입니까? –

+1

@ 팀 : 답변을 업데이트했습니다. –

+0

훌륭한 답변, 업데이트 해 주셔서 감사합니다. 나는 당신이 그것을 어떻게 넣었는지 당신에게 전적으로 동의합니다. 그게 내 머리 속에 똑바로 들어갈 수있게 도와 줬어. –

관련 문제