Есть две перспективы:
С одной стороны, с вашим подходом вы всегда говорите вызывающему, что именно он сделал неправильно, вызывая ваш метод. Это здорово для звонящего, потому что он может исправить это сразу, когда получит ваше исключение. Это будет верно и допустимо, если вы пишете код API, который используется третьей стороной.
С другой стороны, если вы вызываете свой метод самостоятельно, разумным аргументом для создания исключения является то, что вы хотите иметь возможность обрабатывать эту ситуацию с помощью блока catch внутри вашего вызывающего кода! Если у вас нет причин где-то с этим справляться, зачем вообще выкидывать исключение? Единственная причина, которую я вижу, состоит в том, чтобы вести подробный журнал ошибок, перехватывая эти исключения в GlobalExceptionHandler.
Итак, вы видите, что здесь есть две категории исключений: одна для разработчиков, чтобы избежать неправильного использования API, и другая, которая будет использоваться в качестве результата ошибки метода.
Если вы пишете код API, который будет использоваться другими, ваш выбор будет не слушать Боба; -)
Для тех, кто не читал CleanCode, Боб предлагает две вещи:
1.Не следует писать методы, которые возвращают ноль (чтобы впоследствии избежать ненужных проверок). Так что вместо того, чтобы писать это:
var myObject = GetObjectThatDoesSomthing();
if(myObject != null)
{
myObject.DoSomething();
}
... вы должны быть в состоянии написать это:
var myObject = GetObjectThatDoesSomething();
myObject.DoSomething();
очиститель.
2.Вы не должны передавать null своим методам, чтобы избежать ненужных проверок в начале метода, как здесь:
public Point Add(Point p1, Point p2)
{
if(p1 == null) throw ArgumentException();
if(p2 == null) throw ArgumentException();
...
}
Смысл этих правил: если вы будете придерживаться его, вы знаете, что вам не нужно писать эти нулевые проверки, и ваш код становится чище и легче для чтения. Но в тот момент, когда вы используете сторонний код, вы не можете определить, применяли ли они те же правила в своем API, поэтому вы начинаете повторную предварительную или последующую проверку. То же самое, когда вы пишете API для других: как потребители вашего API знают, что вы запрограммировали правила Бобса ...