2009-08-04 5 views
0

У меня есть класс CustomerRepository (в моем BL), и я возвращаю коллекцию следующим образом:Пользовательские коллекции вопрос

public static ICollection<Customer> FindCustomers() 
    { 
     Collection<Customer> customers = null; 
     try 
     { 
      customers = DAL.GetCustomers();    
     } 
     catch (Exception ex) 
     { 
      //log and re-throw exception here 
     } 
     return customers; 
    } 

У меня есть несколько вопросов по этому вопросу:

  1. ли попробовать/catch блокировать нормально?
  2. Я создаю коллекцию снаружи и возвращаю ее за пределы catch.

Могу ли я игнорировать любые лучшие практики здесь?

Очень хотелось бы знать о потенциальных подводных камней здесь :)

+0

просто комментарий, почему ICollection и не IQueryable. btw, слишком много близких фигурных скобок внутри TRY – StevenMcD

ответ

3

Это нормально (и идиоматических)

public static ICollection<Customer> FindCustomers() 
{ 
    try 
    { 
     return DAL.GetCustomers();   
    } 
    catch (Exception ex) 
    { 
     //log and re-throw exception here 
    } 
} 

Я хотел бы добавить, что возвращение IQueryable (или, если не представляется возможным IEnumerable), вероятно, лучше чтобы дать вашему классу больше возможностей для просмотра в будущем.

+0

+1 для IQueryable/IEnumerable –

3
public static ICollection<Customer> FindCustomers() 
{ 
     try 
     { 
      return DAL.GetCustomers(); 
     } 
     catch (Exception ex) 
     { 
      //log here 
      throw; 
     } 
} 

Я думаю, что это лучший вариант

0

Что произойдет, если предположим, что ошибка происходит в Ьгу блока перед возвращения заявления, как в ниже коде я вручную бросать исключение и компилятор предупреждает меня на return h; линия это недостижимый код.

public int Test() 
     { 
      try 
      { 
       int h = 0; 
       h = 100; 
       throw new Exception(); 
       return h; 
      } 
      catch (Exception ex) 
      { 
       throw; 
      } 
     } 

Уверены ли такие предупреждения?

+0

Лучшей практикой было бы иметь int h; вне try, h = 0 внутри try и return h; вне попытки. Почему вы хотите игнорировать предупреждение, если можете позаботиться об этом? –

+0

Когда я сказал, что h = 0 должно быть внутри try, я думал о сложных типах данных, где есть хорошая вероятность, что оператор присваивания может выдать исключение. (Учитывая, что h является int, вам не нужно назначать 0, поскольку это значение по умолчанию для int anyways.) –

+0

@Rashmi: Это мой вопрос: изначально моя коллекция была вне попытки, но все ответы берут коллекцию внутри try блок и вернуть его оттуда. Какой подход лучше всего? – Raghav

0

Если вы выполняете некоторую обработку внутри try, то объявляйте возвращаемые объекты вне try и возвращаете их за пределы catch. Поэтому я думаю, что вы написали правильно.

Я думаю, что если вы используете более конкретные интерфейсы (например, IEnumerable <>), то ваши потребители (или верхние уровни/уровни) могут иметь проблемы с использованием ваших классов коллекций. Им может потребоваться добавить больше работы (например, IEnumerable не поддерживает свойство Count). Использование ICollection <> или даже Collection <> также должно быть в порядке.

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