2012-06-22 8 views
7

나는 항목 모음을 포함하는 클래스가 있습니다. 편의상 GetCurrentItem은throw 할 수있는 속성 만들기 IndexOutOfRangeException

public Type GetCurrentItem 
{ 
    get { return this.items[this.items.Count - 1]; } 
} 

으로 구현되었으며 목록에 항목이없는 경우 예외를 throw합니다.

예외를 throw해야합니까, 아니면 null을 반환해야합니까? 이것이 내가 당신에게 건네주는 API라면, 당신은 무엇을 기대합니까? 예외 또는 null? 이 문제를 해결할 더 좋은 방법이 있습니까?

+2

? (대답 : 의존한다) –

답변

9

어느 것이 더 정확합니까? Kirk의 의견에서 알 수 있듯이 : 그것은 달려 있습니다. 때로는 null이 논리적 인 의미를 가지며, 기본값이 적당하지 않은 경우 예외가 더 적합한 경우가 있습니다. 내가하려고하는 한 가지는 "GetCurrentItem을 논리적 실패 또는 안전한 것으로 부르는 것입니까?"라고 생각하는 것입니다.

GetCurrentItem이없는 경우 전화를 걸지 않으면 예외를 throw하는 것이 올바른 과정입니다. 예를 들어 컬렉션에 HasCurrent 또는 IsEmpty 속성이 있고 누군가가 GetCurrentItem을 호출하기 전에 결과를 조사 할 수있는 경우 "더 잘 알고 있어야합니다." 그러나 현재 항목이 null이라면 클래스를 사용하는 올바른 논리적 인 방법입니다. 그런 다음 꼭 그런 식으로 디자인하십시오. 어느 쪽이든, 나는 사용자가 예상 된 동작을 알 수 있도록 코드 주석의 동작을 문서화합니다.

나는 이것을 말할 것이다. ArgumentOutOfRange 예외가 발생하면 구현 세부 사항이 흐려질 수 있습니다. 즉,이 클래스의 사용자가 내부 구조가 배열 또는 List<T>이라는 것을 모르는 경우 해당 예외를 제거하지 말고 catch 한 다음 랩하고 더 의미있는 것을 내 보냅니다 (사용자 정의 또는 이와 비슷한 InvalidOperationException). 그들은 정말 직접 인수를 전달하지 않는 때문에

, 그들은 ArgumentOutOfRange 예외가

+0

예외의 좋은 선택은'Stack .Peek()'에 의해 설정된 예제 다음에'InvalidOperationException'이다. –

+0

@MichaelLiu : 예, 동의합니다. 내가 편집 한 내용에 덧붙인대로 :-) –

3

오류가 발생합니다. 이것은 다른 컬렉션이 작동하는 방법입니다. 잠재적 인 예외를 처리하는 것은 사용자 응용 프로그램에 달려 있어야합니다 (특히 콜렉션을 사용하는 경우). 계속하기 전에 사용자가 호출 할 수있는 bool HasSelection() 메소드가 있어야합니다.

3

예외적 인 경우 예외를 사용해야합니다. CurrentItem이 null 일 수있는 경우 예외를 던져서는 안됩니다. 나는 왜 CurrentItem을 갖는 것이 예외적인지 보지 못한다.

1

다음 질문은 당신이 GetCurrentItem 안전한 값을 반환 할 것으로 예상 여부 혼란 :-) 될 수지고. Type이 nullable이면 현재 항목이 없을 때 GetCurrentItem이 null을 반환해야합니다. 항상 비어 있지 않은 목록을 기대하고 항상 기본적으로 선택된 항목이 있으면 의미있는 예외를 throw합니다.

일반적으로 사례가 예외이고 일반적인 사용 사례가 아닌 경우 예외를 던져서는 안됩니다. 그러나 이것은 다소 주관적 일 수 있습니다.

0

이 GetCurrentItem이 API에 적합한 경우 항목이 없을 때 "InvalidOperationException"을 throw합니다. 유효한 결과로 null을 허용하는 경우 다르게 이름을 지정할 수 있습니다.

기존 LINQ Last 방법이 이미 동일한 기능을 제공하는 경우를 고려하십시오.

1

나는 사용자의 관점에서 생각하려고합니다. Principal of Least Astonishment으로 이동하십시오.

GetCurrentItem을 호출하고 IndexOutOfRangeException이라고 불렀다면 "나는 색인이있는 항목을 호출하지 않았으므로 현재 항목을 원했습니다."라고 생각합니다. 그러므로, 제 제안은 null을 리턴하는 것입니다. 그러면 "아, 현재 아이템이 없습니다."라고 생각하게 될 것입니다.

또한 속성이 인덱서이고 특정 인덱스에서 항목을 가져 오려면 IndexOutOfRangeException에 놀라지 않을 것입니다.

0

의심스러운 경우 .NET을 따르십시오. 이 기능은 List.Last()와 비슷하게 생깁니다. List.Last()는 비어있는 경우 예외를 발생시킵니다. `Enumerable.Single` 또는`Enumerable.SingleOrDefault` : 올바른 API가

http://msdn.microsoft.com/en-us/library/bb358775

관련 문제