У меня есть система, где employeeId должен alway существовать, если нет некоторая базовая проблема.
Путем я вижу его, то, что у меня есть два варианта проверить этот код:
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#?
Мне нравится он, потому что это опрятно в этом, мне не нравится смотреть, "выдают новое Исключение ("bla bla bla"), тип передает outsite объем класса.
Как правило, исключения следует создавать только в исключительных обстоятельствах. Поскольку это одно из таких обстоятельств, создание исключения является правильным решением.
Это зависит от того, что вы подразумеваете под 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);
}
Используйте исключения, для чего они нужны - исключительные обстоятельства. Все стандартные библиотеки .NET используют этот метод о том, как справляться с такими обстоятельствами, поэтому руководствуйтесь рекомендациями Microsoft.
Идея утверждений, как я всегда их использовал, заключается в том, что они являются мгновенной обратной связью при запуске отладочной сборки. Какое-то выражение по твоему лицу, что что-то случилось. Или войдите в файл, если приложение настроено таким образом.
Исключения используются для обработки исключительного поведения, как указано выше.
То, что я делаю, особенно на ранних этапах жизненного цикла проекта, может быть примерно таким:
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 после того, как будут устранены начальные ошибки.