2012-06-22 4 views
3

У меня есть следующий класс:Какое/когда исключение выбрано, если свойство равно null?

class Foo 
{ 
    public Foo() 
     : this(new List<Bar>()) 
    { 
    } 

    public Foo(IEnumerable<Bar> bars) 
    { 
     Bars = bars; 
    } 

    public IEnumerable<Bar> Bars { get; set; } 

    public Bar GetSingleBar(Data data) 
    { 
     // this method returns a single Bar from the Bars property above 
     // this method returns the Bar which matches the data parameter 
     // this method should not return null 
     // this method throws a NoBarsFoundException if 
     // (a) Bars is empty or 
     // (b) no bar in Bars matches the data 
    } 
} 

Что я должен делать, если Bars это null? Должен ли я делать исключение в установщике для Bars или я должен исключить исключение в GetSingleBar? (Метод GetSingleBar это единственный метод, который использует Bars свойство.)

Должен ли я бросить ArgumentException, ArgumentNullException, InvalidOperationException или NoBarsFoundException?

+2

относится к обзору кода. –

+0

также вы не можете создать новый интерфейс. –

+1

"* Метод GetSingleBar - единственный метод, который использует свойство Bars *" ... для * now *! –

ответ

5

Вероятно System. ArgumentNullException:

Исключение, которое выбрасывается при нулевой ссылки (Nothing в Visual Basic), передается в метод, который не принимает его в качестве действительного аргумента.

throw new ArgumentNullException("bars"); 
0

Это, вероятно, хорошая причина не использовать свойство сеттера, но вместо того, чтобы метод, основанный на ответе от этого вопроса:

Best practices: throwing exceptions from properties

Это потому, что свойство будет становятся потенциально опасными в форме исключения.

вместо того, чтобы беспокоиться об этом, ArgumentNullException является стандартом, если прилагаемый аргумент равен нулю (по меньшей мере, для методов).

Если вы попытаетесь использовать Bars, прежде чем он будет установлен или что-то в этом роде, то я бы выбрал InvalidOperationException, чтобы показать, что объект не находится в правильном состоянии, чтобы обслуживать действие.

0

Я бы сказал, что, когда Bars является null и он никогда не должен быть null, то вы должны бросить InvalidOperationException, так как операция GetSingleBar недопустима в текущем состоянии объекта, и Bars этого свойство вашего класса.

ArgumentNullException, как следует из названия, следует выбросить, только если аргумент null.

Я хотел бы сделать Barsreadonly хотя (если возможно).

0

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

Если вы всегда хотите, чтобы бары не были Null, возможно, вы должны установить его в конструкторе и сделать его закрытым?

0

Если пустая коллекция заставляет объект быть непоследовательным, я бы выбрал setter.

Вы никогда не знаете, какие другие новые методы будут использовать в будущем Bars.

0

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

Также ArgumentNullException является правильным сообщением об ошибке.

Единственная проблема, с которой я столкнулся, заключается в том, что у вас должен быть метод set и свойство только для чтения, поскольку большинство программистов не ожидают, что будет выбрано исключение. Это вполне приемлемо, однако - Properties and Exceptions