2010-04-27 2 views
6

У меня есть система, в которой employeeId должен существовать, если не существует некоторой основной проблемы.C# Throw Exception on use Assert?

Я так понимаю, что у меня есть два варианта, чтобы проверить этот код:

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#?

мне это нравится, потому что это аккуратный в том, что я не люблю смотреть на «бросить новый Exception (» бла-бла-бла ") типа сообщения OutSite в область видимости класса.

+1

Почему не только метод VerifyIdExists выбрал исключение от вашего имени? – Tejs

+0

Я не думаю, что что-то не так с тем, что у вас есть, кроме IMHO. Я бы сменил имя на ThrowIfNotFound. Я так понимаю, это то, что вы хотите включить в сборку выпуска, а также в сборку отладки. –

ответ

3

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

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

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

Фактически, чтобы выбрать пример, в методе Jon Skeet's morelinq используются оба метода. Например here:

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

Да. Мое утверждение предназначено для «Бросания исключения». Спасибо, j. – guazz

+0

@guazz: В первый раз, когда я прочитал ваш вопрос, я думал, что вы сравниваете бросание с утверждением - и, глядя на другие ответы и голоса, так же как и все остальные. Возможно, вы захотите изменить свой вопрос, чтобы сделать его более понятным. –

+0

метод расширения для исключения аргументов? –

1

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

5

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

0

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

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

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

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); 
    } 
} 

Возможно refractoring вне Debug.Assert когда начальная икота рассматривается.