2010-07-05 6 views
2

Не думайте, что это возможно, но я думал, что спрошу, и, возможно, кто-то может предложить альтернативный метод или образец.Возвращение C# Исключение во время выполнения

Скажите, что у меня есть класс Customer, который имеет список книг, которые вытаскиваются отдельно от внешнего источника. Если класс Customer успешна, но книги не удалось загрузить, я не хочу, чтобы выбросить исключение, если клиент не пытается получить доступ к свойству книги так ..

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

ли что-то вдоль этих линий возможно?

+0

btw, FCL имеет ряд специальных классов для такой ситуации - 'ArgumentException',' ArgumentNullException' и 'ArgumentOutOfRangeException' – abatishchev

+0

НЕТ рекомендуется поднимать исключение типа исключения. это базовый тип для всех других исключений в NET, вы можете создать более конкретный тип исключения или создать собственное собственное исключение. – Arseny

+0

Я действительно думаю, что InvalidOperationException будет подходящим исключением. Из MSDN в InvalidOperationException - выполняется неадекватный вызов объекта на основе состояния объекта. –

ответ

10

Как насчет размещения этой логики в Books собственности попятился с частным полем books:

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; 
    } 
} 
+3

Это хороший шаблон, за исключением типа Exception. Лучше всего бросить подтип (например, 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 не должно быть действительно брошено. –

-1

Пример Адриана изменен:

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

Вы также можете использовать throw NullReferenceException в приведенном выше примере, если вы строго получаете нули из db или где-то.

Смежные вопросы