Определение новых типов исключений в большинстве случаев должно выполняться только для исключений, которые должны быть перехвачены. В этом случае вы не хотите, чтобы кто-нибудь поймал исключение (вы должны редко ловить ArgumentException
s), поэтому нет смысла создавать новое исключение.
В этом случае вы должны выбрать тип исключения, который лучше всего описывает ваше исключение. Я не верю, что это ArgumentOutOfRangeException
, потому что трудно увидеть строку как-то «варьируемую». Ваш лучший выбор - ArgumentException
, а тип описывает, что не так (аргумент).
Иногда бывает полезно определить новый тип исключения, даже если никто не намеревается его перехватить. В библиотеке CuttingEdge.Conditions я определил PostconditionException
только потому, что выбрасывание ArgumentException
показалось неправильным при проверке постусловий.
Для разработчиков фреймворка определение новых исключений (которые не должны попадать в ловушку) иногда может быть полезным, поскольку позволяет лучше сообщать о том, что пошло не так. Тем не менее, работая над бизнес-приложениями, я едва ли определяю исключения, которые я не хочу, чтобы кто-то ловил. Я просто использую существующие исключения.
КСТАТИ. При использовании CuttingEdge.Conditions ваш пример кода может быть переписан следующим образом:
public FilterItem(string name, IEnumerable<string> extensions)
{
Condition.Requires(name, "name").IsNotNullOrWhiteSpace();
Condition.Requires(extensions, "extensions").IsNotEmpty();
this.Name = name;
this.Extensions = extensions;
}
Последнее примечание, я бы переписал последнюю строку кода следующим образом:
this.Extensions = extensions.ToArray();
Потому что, когда вы требуете, чтобы коллекция была не пустой, вы не хотите, чтобы кто-либо очищал ее после того, как проверил это.