Мне очень сложно, когда дело доходит до good design.
Я не уверен, должен ли я позволить более позднему методу выбросить исключение или я должен сам его выбросить.
Вещь:
Тип изменения Исключения основан на методе, который называется. В более позднем методе это может быть InvalidOperation, но в текущем методе ArgumentException лучше подходит.
Должен ли я использовать текущий метод или позволить более позднему методу отбрасывать его
Теперь я должен выполнить все проверки, чтобы исключить правильный тип исключения, или я должен позволить более глубокому методу выбросить неправильный тип исключения?
Рассмотрим это:
private bool _canWaste = false;
/// <summary>
/// Runs around and wastes something.
/// </summary>
/// <exception cref="InvalidOperationException">
/// Thrown when <paramref name="CanPower"/> is false.
/// </exception>
public void Run(bool CanWaste) {
_canWaste = CanWaste;
// <- Should I check if we can waste and throw an ArgumentException here or
// throw the 'wrong' type later in Waste?
Waste();
}
/// <summary>
/// Wastes something.
/// </summary>
/// <exception cref="InvalidOperationException">
/// Thrown when we cannot waste.
/// </exception>
private void Waste() {
if(!_canWaste) throw new InvalidOperationException("We cannot waste.");
/* ... */
}
Это простой пример (который не имеет смысла), где было бы сделано Исли.
Но, конечно, есть методы, где оценка намного сложнее.
Другой вариант заключается в том, чтобы поймать исключение и выбросить новое из правильного типа.
Но я думаю, что это повлияло бы на производительность и зарегистрировало бы что-то нераскрытое в выводе.
Но если правильность аргумента может быть подтверждена только путем вызова метода, который генерирует исключение, если аргумент недействителен. Должен ли я поймать это и выбросить invalidargumentexception? –
@NoelWidmer, рассмотрим более простой пример, предположим, что вы получаете строковый параметр для 'DateTime', который должен быть в определенном формате. Когда вы пытаетесь проанализировать свою * строку * DateTime на объект DateTime, используя' DateTime.ParseExact 'и вы получите исключение из строкового формата недопустимого значения. В этом случае вы можете уловить исключение, возникшее во время разбора, и вернуть клиенту' InvalidArugmentException'. Если ваш сценарий подобен этому, то обязательно, поймайте 'InvalidOperationException', а затем выбросите' InvalidArgumentException' – Habib
В дополнение к выше ^^, если единственной целью вашего метода является проверка аргумента, его следует назвать вероятным и может возвращать bool, указывающий, является ли аргумент действительным или нет, вместо исключения исключения, просто делая намерение более явным, а код более читаемым - IMO. – Habib