Какое исключение следует генерировать, когда обязательное свойство объекта параметра равно нулю - PullRequest
2 голосов
/ 08 июля 2011

Я использую объекты параметров для инкапсуляции параметров, которые передаются моим бизнес-правилам. Правило создается с использованием параметра контекста, который затем может быть изменен, а затем выполняется правило. Некоторые свойства этого объекта являются обязательными, в противном случае метод выдаст NullReferenceException. Однако, если я выбрасываю ArgumentNullException, я получаю предупреждение о том, что имя параметра не соответствует ни одному из моих параметров. Что будет подходящим исключением для этой ситуации?

public class GetAttributes : BusinessRuleBase 
{
    private readonly IGetAttributesContext _context;


    public GetAttributes(IGetAttributesContext context)
    {
        _context = context;
    }

    public override void Execute()
    {
        if (_context.AttributeModel == null)
        {
            //Exception would be thrown here
        }
        _context.Attributes = _context.AttributeModel
                                      .DoSomething(_context.EntityType);
    }
}

Ответы [ 4 ]

2 голосов
/ 08 июля 2011

Если вы используете Code Contracts и хотите публично выставить свойство HasAttributeModel, я рекомендую

Contract.Requires(this.HasAttributeModel);

В противном случае, вы должны сгенерировать пользовательское исключение, которое происходит от InvalidOperationException здесь. Метод, который вы пытаетесь выполнить, недопустим, учитывая текущее состояние объекта. Из документации:

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

В вашем пользовательском сообщении должно быть указано, что экземпляр AttributeModel равен null.

Более широкий вопрос: почему вы позволяете своим экземплярам находиться в состоянии, когда для них может быть вызван метод, когда объект находится в недопустимом состоянии? Вы должны избегать этого, если можете. Например, почему GetAttributes не проверяет, что context.AttributeModel не null? Вы могли бы иметь

Contract.Requires(context.AttributeModel != null);

в качестве предварительного условия для этого метода. Однако здесь есть некоторая опасность, заключающаяся в том, что если кто-то сохранит действующую ссылку на ссылку параметра context, он может разрушить состояние, поскольку вы сохраняете ссылку через закрытую переменную _context. Помните об этом и избегайте этого, если можете.

1 голос
/ 08 июля 2011

Если вы считаете, что кто-то может захотеть перехватить это конкретное исключение и обработать его не так, как типичные исключения, напишите свой собственный класс исключений.

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

Если нет смысла проверять это свойство на ранней стадии, и вы все еще хотите использоватьсистемный тип исключения, Джейсон прав: используйте InvalidOperationException.

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

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

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

Добавьте NullReferenceException с вашим собственным описанием или создайте собственное исключение.

InvalidArgumentException говорит, что аргумент недействителен, но в вашем случае аргумент отсутствует, и для того, чтобы быть недействительным или действительным, он должен быть не нулевым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...