Я открыл вопрос о повторных проверках параметров в открытых методах.
Результат мне показался ясным, но из-за этого у меня есть еще один вопрос, касающийся этих проверок параметров (у меня был тот же вопрос, когда я писал свой последний вопрос, но формулировка была неуклюжей и я хотел слишком много (более одного вопроса в одном пост), надеюсь в этот раз лучше):
Если у меня есть повторяющиеся параметры, которые будут переданы общедоступным методам моего класса, параметры должны быть проверены в каждом общедоступном методе. Если я делегирую проверку другому (частному) методу, например
void EnsureIndexIsValid(int index){
if(index <0 || index > A_VALUE){
throw new IndexOutOfRangeException(“..message..”);
}
}
тогда метод выбрасывания - EnsureIndexIsValidIndex, а не вызываемый метод. Это плохая практика?
Если это плохая практика, одной из возможностей будет перехватить исключение в методе using, а затем повторно вызвать исключение. Является ли это хорошей практикой (источником исключения для вызывающего абонента теперь является AMethod, а не EnsureIndexIsValid)? Или это только над головой?
public void AMethod(int index,....){
try{
EnsureIndexIsValid(index)
}catch(IndexOutOfRangeException e){
throw e;
}
// ....
EDIT:
Следующее, кажется, определенно не является хорошей идеей
Если бы это было хорошей практикой, было бы законно поймать общее исключение для большего количества этих проверок и затем повторно сгенерировать:
public void AMethod(int index,....){
try{
EnsureIndexIsValid(index);
EnsuresValueIsInValidRange(anotherParamter);
}catch(Exception e){
throw e;
}
// ...
Вывод:
Для всех, кто заходит в эту ветку, вот короткий ответ:
Делегирование проверок параметров, похоже, является распространенным шаблоном и является разумным. Однако перебрасывание таких исключений, чтобы скрыть метод проверки, не очень разумно. Лучше вернуть логическое значение из метода проверки, а затем вызвать исключение в открытом методе, если проверка не удалась.