C # выкинуть исключение по использованию Assert? - PullRequest
6 голосов
/ 27 апреля 2010

У меня есть система, в которой employeeId должен существовать всегда, если только не существует какой-либо проблемы.

На мой взгляд, у меня есть два варианта проверки этого кода:

1

public void GetEmployee(Employee employee)  
{  
   bool exists = EmployeeRepository.VerifyIdExists(Employee.Id);  
   if (!exists)   
   {   
     throw new Exception("Id does not exist");  
   }  
}    

или 2:

public void GetEmployee(Employee employee)  
{  
  EmployeeRepository.AssertIfNotFound(Employee.Id);  
}  

Допустим ли вариант № 2 на языке C #?

Мне это нравится, потому что это аккуратно, потому что мне не нравится смотреть на сообщения типа "throw new Exception (" bla bla bla ") вне рамок класса.

Ответы [ 4 ]

5 голосов
/ 27 апреля 2010

Как правило, вы должны генерировать исключения только в исключительных обстоятельствах. Поскольку это одно из таких обстоятельств, исключение - это правильная вещь.

4 голосов
/ 27 апреля 2010

Это зависит от того, что вы подразумеваете под Assert.

. Вы можете использовать Debug.Assert (или Trace.Assert , если хотите, чтобы он также работал врежим выпуска).Однако это не так полезно, потому что останавливает программу и открывает диалоговое окно, пока пользователь не нажмет что-либо.Это не так хорошо для неконтролируемой системы.Поэтому в большинстве случаев я рекомендую вместо этого бросить, поскольку вы можете решить, как вы хотите реагировать на ошибку - остановите программу или просто войдите в систему и попробуйте продолжить.

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

Фактически, чтобы выбрать пример, в morelinq Джона Скита используются оба метода,Например здесь :

public static IEnumerable<TSource> AssertCount<TSource>(
    this IEnumerable<TSource> source, 
    int count,
    Func<int, int, Exception> errorSelector)
{
    source.ThrowIfNull("source");
    if (count < 0) throw new ArgumentException(null, "count");
    errorSelector.ThrowIfNull("errorSelector");

    return AssertCountImpl(source, count, errorSelector);
}
1 голос
/ 27 апреля 2010

Используйте исключения, для чего они существуют - исключительные обстоятельства. Все стандартные библиотеки .NET используют этот метод обработки таких обстоятельств, поэтому выслушивает ваши реплики от Microsoft.

0 голосов
/ 27 апреля 2010

Идея, лежащая в основе утверждений, как я их всегда использовал, заключается в том, что они представляют собой мгновенную обратную связь при запуске отладочной сборки. Что-то вроде того, что что-то случилось. Или войдите в файл, если приложение настроено таким образом.

Исключения используются для обработки исключительного поведения, как отмечено выше.

То, что я делаю, особенно в начале жизненного цикла проектов, может выглядеть примерно так:

public void GetEmployee(Employee employee)  
{  
   bool exists = EmployeeRepository.VerifyIdExists(Employee.Id);  
   Debug.Assert( exists, "employee does not exist for id: " + Employee.Id );
   if (!exists)   
   {   
     throw new Exception("Id does not exist);  
   }  
}   

Возможно, рефракторинг Debug.Assert после того, как будут устранены начальные ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...