Если рассматриваемый оператор throw действительно недоступен при любом возможном сценарии, то он должен быть удален и заменен на:
Debug.Fail("This should be unreachable; please find and fix the bug that caused this to be reached.");
Если код достижим, напишите модульный тест, который тестирует этот сценарий. Сценарии сообщения об ошибках для общедоступных методов - совершенно допустимые сценарии. Вы должны правильно обрабатывать все данные, даже плохие. Если правильно сделать исключение, проверьте, что оно выдается.
ОБНОВЛЕНИЕ: согласно комментариям, на самом деле невозможно, чтобы ошибка была нажата, и поэтому код недоступен. Но теперь Debug.Fail также недоступен и не компилируется, потому что компилятор отмечает, что метод, который возвращает значение, имеет достижимую конечную точку.
Первая проблема на самом деле не должна быть проблемой; несомненно, инструмент покрытия кода должен быть настраиваемым, чтобы игнорировать недостижимый код только для отладки. Но обе проблемы можно решить, переписав цикл:
public int FirstInvalidDigitPosition
{
get
{
int index = 0;
while(true)
{
Debug.Assert(index < this.positions.Length, "Attempt to get invalid digit position but there are no invalid digits!");
if (!this.positions[index].Valid) return index;
index++;
}
}
}
Альтернативным подходом было бы реорганизовать код, чтобы у вас не возникла проблема с самого начала:
public int? FirstInvalidDigitPosition {
get {
for (int index = 0; index < this.positions.Count; ++index) {
if (!this.positions[index].Valid) return index;
}
return null;
}
}
и теперь вам не нужно ограничивать абонентов для вызова сначала AreThereInvalidDigits; просто сделайте законным вызов этого метода в любое время. Это кажется более безопасной вещью. Методы, которые взрываются, когда вы не выполняете дорогостоящую проверку, чтобы убедиться, что они безопасны для вызова, являются хрупкими, опасными методами.