컬렉션에 중복 개체를 삽입하려고 할 때 발생하는 올바른 .NET 예외는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/54789

  •  09-06-2019
  •  | 
  •  

문제

컬렉션인 AssignedSoftware 속성이 있는 자산 개체가 있습니다.

동일한 소프트웨어가 자산에 두 번 이상 할당되지 않도록 하고 싶습니다.Add 메서드에서는 소프트웨어가 이미 존재하는지 확인하고, 존재한다면 예외를 발생시키고 싶습니다.

발생시켜야 하는 표준 .NET 예외가 있습니까?아니면 모범 사례에 따라 나만의 사용자 지정 예외를 생성해야 합니까?

도움이 되었습니까?

해결책

오류에 대한 클래스 라이브러리 디자인 지침(http://msdn.microsoft.com/en-us/library/8ey5ey87(VS.71).aspx):

대부분의 경우 미리 정의된 예외 유형을 사용합니다.클래스 라이브러리 사용자가 이 새로운 유형의 예외를 포착하고 예외 유형 자체를 기반으로 프로그래밍 방식 작업을 수행할 것으로 예상되는 프로그래밍 방식 시나리오에 대해서만 새 예외 유형을 정의합니다.이는 예외 문자열을 구문 분석하는 대신 성능과 유지 관리에 부정적인 영향을 미칠 수 있습니다.

...

잘못된 매개 변수가 전달되거나 감지되면 ArgumentException을 발생시키거나 이 클래스에서 파생된 예외를 만듭니다.

개체의 현재 상태를 고려할 때 속성 집합 접근자 또는 메서드에 대한 호출이 적절하지 않은 경우 InvalidOperationException 예외가 발생합니다.

이것은 나에게 "객체 상태가 유효하지 않음" 시나리오처럼 보이므로 ArgumentException 대신 InvalidOperationException을 선택하겠습니다.매개변수는 유효하지만 객체 수명의 이 시점에서는 유효하지 않습니다.

다른 팁

InvalidOperationException 답변으로 받아 들여 졌습니까?!그것은 ArgumentException?!

InvalidOperationException 호출된 메소드/속성을 가진 객체가 초기화되지 않은 상태 등으로 인해 요청에 대처할 수 없는 경우에 사용해야 합니다.여기서 문제는 객체가 추가되는 것이 아니라 객체에 전달되는 객체입니다(속기입니다). 생각해 보세요. 이 Add 호출이 전혀 발생하지 않은 경우 개체가 여전히 정상적으로 작동할까요? 예!

이것은 인수예외.

.Net은 동일한 키 값을 사용하여 해시 테이블에 항목을 두 번 추가하려고 하면 System.ArgumentException을 발생시키므로 더 구체적인 내용이 없는 것처럼 보입니다.좀 더 구체적인 내용이 필요한 경우 자신만의 예외를 작성할 수도 있습니다.

기본 라이브러리 클래스가 수행하는 작업이므로 ArgumentException을 발생시켜야 할 것입니다.

글쎄, 정말 독특한 아이템이 포함된 컬렉션을 원한다면 다음을 살펴보는 것이 좋습니다. HashSet 객체 (C# 3.0에서 사용 가능)

그렇지 않은 경우 취할 수 있는 두 가지 접근 방식은 다음과 같습니다.

  • 언급한 대로 작업에 대한 사용자 지정 예외를 만듭니다.
  • 부울 결과를 반환하는 Add() 메서드를 구현합니다.항목이 추가되면 true이고 항목이 이미 컬렉션에 중복된 항목을 갖고 있으면 false입니다.

두 접근 방식 모두 일관되게 사용하는 한 모범 사례로 간주될 수 있습니다.

나는 항상 InvalidOperationException을 좋아했습니다.그러나 DuplicateSoftwareAssignmentException과 같은 사용자 지정 예외를 생성할 수도 있습니다.


프레임워크 디자인 지침에서:

"유효하지 않은 매개 변수가 전달되거나 감지되면이 클래스에서 파생 된 ArgumentException을 던지거나 예외를 만듭니다.

객체의 현재 상태가 주어지면 속성 세트 액세서 또는 메소드에 대한 호출이 적절하지 않은 경우 InvalidOperationException 예외를 던지십시오. "

현재 상태에는 다른 클래스 인스턴스에 대한 참조가 포함되어 있습니다.이 경우 상태에는 추가되는 인스턴스에 대한 참조가 이미 포함되어 있으므로 메서드 호출이 부적절합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top