2010-07-05 3 views
2

가능하다고 생각하지 않지만 내가 물을 것이라고 생각하지만 다른 기술이나 패턴을 제안 할 수 있습니다.런타임시 예외를 반환하는 C#

나는 외부 소스에서 개별적으로 가져온 책 목록으로 구성된 고객 클래스가 있다고 가정 해보십시오. 고객 클래스는 성공적인하지만 책은

this.Books = new List<Book>() 
{ 
    throw new Exception("Books couldn't load because blah blah"); 
}; 

가능이 라인을 따라 뭔가가 .. 클라이언트가 그래서 책 속성에 액세스하려고하지 않는 한 나는 예외를 throw하지 않으려는로드에 실패하면? 당신의 책 속성에

public IEnumerable<Book> Books //or public IList<Book> Books 
{ 
    get 
    { 
     if(this.books == null) 
      throw new Exception("Books couldn't load because blah blah"); 
     return this.books; 
    } 
} 
+0

btw, FCL에는 이러한 상황에 대한 여러 특수 클래스가 있습니다. - ArgumentException','ArgumentNullException' 및'ArgumentOutOfRangeException' – abatishchev

+0

Exception 유형의 예외를 발생시키지 않는 것이 좋습니다. NET의 다른 모든 예외에 대한 기본 유형이므로보다 구체적인 예외 유형이 생기거나 사용자 정의 예외를 만들 수 있습니다. – Arseny

+0

사실 InvalidOperationException이 적절한 예외라고 생각합니다. MSDN From InvalidOperationException - 개체 상태에 따라 부적절한 개체 호출이 발생했습니다. –

답변

10

애드리안의 예 수정 :

public List<Book> Books { get { 
    if (this.books == null) // or any other flag check 
    throw new NullReferenceException("Books are not loaded."); 
    return this.books; 
} } 

db 또는 다른 곳에서 null을 엄격하게 가져 오는 경우 위의 예제에서 throw NullReferenceException을 사용할 수도 있습니다.

+3

이것은 예외 유형을 제외하고는 좋은 패턴입니다. 서브 타입을 던지거나 (예를 들어'InvalidOperationException') 자신의 것을 구현하는 것이 더 좋습니다. –

4

컬렉션이로드되어 있는지 여부를 확인하는 로직을 추가 :

public List<Book> Books { get { 
    if (this.books == null) // or any other flag check 
    throw new InvalidOperationException("Books are not loaded."); 
    return this.books; 
} } 
+0

예외 유형에 대해 큰 소리를 지르지 않으면 System.Exception이 실제로 throw되지 않아야합니다. –

-1
Books 특성에이 논리를 배치에 대한 개인 필드 books로 물러 어떻게
관련 문제