Каков соответствующий тип исключения .NET, когда команда выдается для объекта, который не может быть найден? - PullRequest
2 голосов
/ 11 июля 2011

Многие из моих методов уровня приложения работают примерно так:

    public class Command
    {
        public int Id { get; private set; }
    }

    public class Repository
    {
        public Entity Load(int id)
        {
            // the usual stuff here
        }
    }

    public class AppService
    {
        public void Execute(Command command)
        {
            var entity = new Repository().Load(command.Id);
            if (entity == null)
            {
                // what type of exception do I throw here?
            }
        }
    }

Какой тип исключения я должен выдать, если клиент выдал команду для объекта, который не может быть найден? Спецификация InvalidOperationException на MSDN ссылается на недопустимое «состояние объекта».Похоже, что это не совсем применимо - это просто плохая команда.

Есть предложения?

Ответы [ 3 ]

5 голосов
/ 11 июля 2011

Я бы предпочел InvalidOperationException, так как это имеет смысловой смысл.Состояние для Command является плохим, поскольку его Id недопустимо.

Кроме того, я считаю, что обеспечение паритета с помощью .Net Framework полезно для разработчиков, которые позже присоединяются к вашему проекту.,Рассматривая, как Microsoft обрабатывает подобные ситуации, такие как Enumerable.Single<TSource> или EntityReference<TEntity>.Load, мы находим, что они используют InvalidOperationException.

3 голосов
/ 11 июля 2011

Если бы это был я, я бы, вероятно, вручную бросил свое собственное исключение, чтобы обработать этот случай (если исключение даже действительно необходимо).

Если бы я чувствовал себя ленивым, я бы, вероятно, использовал ArgumentException, поскольку аргумент команды технически недопустим, поскольку сущность, на которую он ссылается, не существует.

0 голосов
/ 11 июля 2011

Я бы выбрал ApplicationException , так как это нефатальное исключение приложения.Просто так получилось, что данных нет.

Возможно, лучшим подходом было бы использование собственных исключений, полученных из класса Exception, если вы хотите иметь лучший контроль.

...