Каковы плюсы и минусы обработки ошибок в начале и в конце метода
По опыту моего программиста, я смешал обработку ошибок всеми возможными способами... Я создал свой личный стиль.
Тем не менее, я хотел бы услышать то, что вы считаете преимуществами и недостатками обработки ошибок в начале и в конце метода.
Обработка в начале:
public String GenerateSomeStringData(String data, int value)
{
if (data == null)
throw new ArgumentNullException("data");
if (value <= 0)
throw new ArgumentException("value must be greater than zero");
int dataValue;
if (!int.TryParse(data, out dataValue))
throw new InvalidOperationException("data does not contain an integer");
return dataValue * 4 + value / 12;
}
Обработка в конце: (тот же пример)
public String GenerateSomeStringData(String data, int value)
{
if (data != null)
{
if (value > 0)
{
int dataValue;
if (int.TryParse(data, out dataValue))
{
return dataValue * 4 + value / 12;
}
else
throw new InvalidOperationException("data does not contain an integer");
}
else
throw new ArgumentException("value must be greater than zero");
}
else
throw new ArgumentNullException("data");
}
Какие критерии вы используете при решении, как подойти к этому? Читабельность, ремонтопригодность, краткость?
4 ответа
Правильность ввода должна быть предварительным условием для выполнения метода - как таковой, я бы (и делал) всегда сначала делал обработку ошибок.
Это имеет следующие преимущества:
Человеку легче разобрать: сначала проверяют предварительные условия, а затем логику выполнения (что обычно приводит к некоторому последующему условию)
Четкое разделение проблем между обработкой ошибок и логикой выполнения
в вашем методе: логика проверки не "прилипает" к логике выполнения
Как упоминалось в комментариях, вы должны различать недопустимый ввод, который нарушает предусловие и вызывает условие ошибки (например, выбрасывание исключения), и допустимый ввод, который составляет граничное условие (т. Е. Для обработки требуется специальная логика). Последний случай я бы обработал отдельно после утверждения предварительных условий, в начале логики выполнения вашего метода.
Как уже упоминалось, я проверял бы правильность ввода перед выполнением какой-либо основной логики метода. Это не только логично, но и уменьшает уровни отступа в вашем коде и гарантирует, что у вас не будет длинных операторов if {}, которые вы не увидите на одном экране
Первый способ намного лучше.
Это поможет вам сохранить все ваши проверки в одном месте. Вы могли бы даже написать универсальную функцию для обработки этого типа проверок.
Определенно больше читаемости. Вы закончили со всеми вашими проверками в начале, чтобы вы могли продолжить свою действительную логику.
Если ваш код охватывает чуть больше, будет сложно отследить закрывающие скобки в циклах if.
Мое мнение таково: сначала сделайте проверку состояния ошибки, чтобы получить четкое определение для кого-то другого, что хорошо для вашего метода, а что нет.