에 NotImplementedException()
을 던져야합니까? 가능한 모든 열거 유형에 대해 대/소문자가 있으면 어떻게해야합니까?switch 문에서 기본 NotImplementedException을 throw합니다.
답변
값이 인 경우은 정의 상 열거 형 값과 일치해야하며 사용자가 다른 값을 받았으므로 그 값은 잘못된 것입니다.
하지만 이제 문맥을 고려해야합니다.
이 메서드는 비공개이며 클래스 라이브러리 또는 응용 프로그램의 멤버 만 액세스 할 수 있습니까? 그렇다면 처음부터 발생해서는 안되는 코딩 오류입니다. 주장하고 실패하십시오.
반면 공개 또는 보호 된 방법이고 라이브러리를 사용하는 클라이언트가 액세스 할 수있는 경우 의미있는 메시지 (잘 알려진 예외 유형)를 던져야합니다.
프레임 워크에서 열거 형의 범위가 선택되지 않았 음을 기억해야합니다. 메소드에 Environment.SpecialFolder 유형의 매개 변수가 필요하다고 지정할 수 있습니다. 그러나 그것은 어떤 32 비트 정수 값을 받아 들일 것입니다.
따라서, 귀하의 방법이 공공 소비를위한 것이라면, 즉, 예, 반드시 throw하십시오. 일반 소비가 아닌 경우 Assert.
+1 잘 말한 적이. 예기치 않은 값이 자신의 것으로부터 나온다면 Assert하고 실패합니다. 다른 한편, 코드를 사용하는 다른 사람이 온다면 예외를 throw하고 호출 코드에 복구 기회를 주어야합니다. –
왜 Assert는 던지기보다 낫다. 어쩌면 그 조건은 드문 경우이며 개발자가 충돌하지 않을 수도 있고 릴리스 빌드 (Assert가 컴파일되지 않은)를 사용하는 테스터 만 공격을받으며 오류는 삼킨다. 오류를 삼키는 것이 낫지 만, 충돌하지 말고 스택 추적으로 충돌하는 대신 잘못된 것을 디버깅하기가 어렵습니까? –
또 다른 질문은 다른 회사에서 API를 작성하지 않으면 얼마나 많은 오류 검사가 코드에 넣을 가치가 있는지입니다. 짧은 코드는 오류 검사로 인해 각 메서드 크기가 두 배로되는 코드보다 읽기 쉽다고 생각합니다. 그렇지 않니? –
정말 특정 프로세스에 따라 다르지만 예, 무언가가 존재하지 않을 경우 기본 : 대소 문자로 응답하는 것이 좋습니다.
합리적인 선택처럼 들립니다.
개인적으로 새로운 유형의 예외 (아마도 InvalidEnumException
)를 만들거나 지원 팀에 이해할 수있는 다른 이름을 지정하고이를 버립니다.
나는 많은 기존의 예외 유형 중 하나를 직접 시도하고 재사용하려고합니다. http://blogs.msdn.com/jaredpar/archive/2008/10/20/custom-exceptions-when-should-you-create-them.aspx – Joe
동의하지 않았기 때문에 downvoted 동의합니다. 사용자 정의 예외 유형 –
코드가 기본값에 도달하고 예상하지 못했기 때문에 코드에있는 내용이 생각한대로 작동하지 않기 때문에 ApplicationException
을 던질 것입니다.
ApplicationException을 사용하면 안된다. –
나는 그 –
나는 최소한 Debug.Fail()
을 넣어야한다고 말하고 싶습니다.
메소드를 진행할 수없는 경우를 대비하여 예외를 throw해야합니다. 그러나 열거 형 값을 문자열 표현으로 변환하는 것과 같은 경우 대신 경고 문자열을 반환 할 수 있습니다. 명백한 실수로 인해 제품이 사용자에게 충돌을 일으키지 않으며, 해결 방법이있을 것이며 모든 사용자가 만족할 것입니다.
아마도 NotImplementedException이 아니지만 ArgumentException입니다. 정말로 당신이 그것을 사용하고있는 곳에 달려 있습니다.
정말 사용 사례에 따라 다릅니다. 통합 초기에 예외가 발생하면 도움이 될 것입니다. 라이브러리 사용자는 오류를 즉시 알 수 있습니다.
예외가 발생하면 어떻게 될까요? 어떤 문맥에서 switch 문이 실행됩니까? 그 상황이 일어날 것인가? 런타임에 프로덕션 코드에서 발생해야합니까? 당신의 단위 테스트가이 상황을 다루고 있습니까? 그렇다면 아마도 어설트가 더 좋을 것입니다.
먼저 알려진 경우를 벗어나는 값을 얻었 으면 무엇을 의미하는지 고려해야합니다. 즉, 전환되는 변수는 무엇을 나타 냅니까? 그런 다음 실제로 발생하는 상황에 맞는 예외 유형을 사용할 수 있습니다.
정말 다릅니다.
NotImplementedException은 저와 같은 것입니다. 누군가가 나중에 코드를 완성하게 될 것입니다. 그러나 나는 그것이 발생해서는 안되는 기본 사건의 경우라고 생각하지 않습니다.
개체의 상태를 확인할 때 InvalidOperationException을 고려해보십시오. 귀하의 방법은 기존의 경우에만 작동하도록 설계되었습니다.
입력 매개 변수를 구별 할 때 ArgumentException이 항상 적절합니다.
다른 경우 나는 NotSupportedException을 선호합니다. 플랫폼이나 버전에 문제가 있음을 나타냅니다. 그리고 호환되지 않는 버전의 코드는 발생하지 않아야하는 스위치의 기본 사례가 발생할 때 문제의 진정한 근원입니다.
흥미로운 대답입니다. 당신의 동기/추론은 무엇입니까? –
@ 팀 : 답변을 업데이트했습니다. –
훌륭한 답변, 업데이트 해 주셔서 감사합니다. 나는 당신이 그것을 어떻게 넣었는지 당신에게 전적으로 동의합니다. 그게 내 머리 속에 똑바로 들어갈 수있게 도와 줬어. –
내 생각에 응용 프로그램에 따라 다르며 범위를 벗어난 값으로 끝나면 어떻게 될지 생각해보십시오. – Joe