Какое исключение следует выбросить из Propery Set? - PullRequest
1 голос
/ 31 декабря 2008

В .NET, какой тип исключения должен генерироваться, если кто-то передает недопустимое значение в часть set { } свойства?

Пример:

public string Provider
{
    get { return _provider; }
    set
    {
        if (String.IsNullOrEmpty(value)) throw new Exception("Provider cannot be null or empty."); //what type of exception should be thrown here instead?
        _provider = value;
    }
}

Примечание:

Я задаю этот вопрос, поскольку он относится к .NET, но он может относиться и ко многим другим языкам. Так что если у вас есть хороший ответ, который относится к чему-то другому, чем .NET Framework, пожалуйста, напишите!

Ответы [ 4 ]

7 голосов
/ 31 декабря 2008

ArgumentException , ArgumentOutOfRangeException, ArgumentNullException или аналогичный.

1 голос
/ 21 февраля 2011

Я согласен с Анджей. Исключение должно быть выброшено в «set», потому что свойство НИКОГДА не должно быть установлено на недопустимое значение, и вам необходимо «захватить контекст, когда было установлено недопустимое значение»

Я использую один из классов ArgumentException, потому что "под капотом" "set" - это вызов автоматически созданного метода с именем 'CLASSNAME'.set_'PROPERTYNAME' (значение)

Например

class MyClass
{
  string name;

  public string Name {
    get {
      return name;
    }
    set {
      if (value==null) {
        throw new ArgumentNullException("value", "The value of the property Name cannot be set to null.");
      }
      name = value;
    }
  }

}

Внутренне это создает два метода

public string get_Name()

и

public void set_Name(string value)

Если вы отображаете трассировку стека, это то место, откуда будет выброшено исключение.

Именно поэтому я всегда включаю в сообщение текст типа «Значение свойства Name ...», чтобы пользователь свойства мог видеть, где было сгенерировано исключение, поскольку не будет метода с именем set_SOMEPROPERTY (значение SOMETYPE ) видна пользователю библиотеки классов.

(кроме того, это то, что вы должны делать в соответствии с «Руководствами по проектированию NET Framework 4 для исключений, отлова и выброса стандартных исключений ( Здесь )» Примерно на полпути вниз по странице в разделе «ArgumentException, ArgumentNullException и ArgumentOutOfRangeException» говорится «Использовать значение для имени параметра неявного значения установщиков свойств»)

1 голос
/ 07 января 2009

Вообще говоря, я не согласен с Джоном Б. в отношении того, когда генерировать исключение - если оно вызывается при вызове set (), оно будет захватывать контекст, когда было установлено недопустимое значение. С другой стороны, если вы просто установите для него какое-то фиктивное значение и сгенерируете исключение в другом месте, то в зависимости от выбранного вами подхода клиент либо увидит фиктивное значение без указания того, что это значение не было фактически установлено, либо получит исключение, которое не даст им никакого представления о том, кто несет ответственность за недействительное состояние или как его исправить.

Теперь в некоторых ситуациях этот метод может иметь смысл - если по какой-то неизбежной причине свойство является чрезвычайно изменчивым, и вы решили, что допустимо временно устанавливать недопустимые свойства, но (на основе некоторой внешней синхронизации) клиент не разрешается извлекать свойство, пока оно не станет законным, стабильным значением. Это тоже не очень хорошо, но я уверен, что возможно быть в ситуации, когда вы не можете помочь в этой ситуации.

И поскольку вы спрашивали о языках, отличных от .NET, в Java я использовал бы исключение IllegalArgumentException в общем случае - возможно, старое доброе NullPointerException, если аргумент равен нулю.

0 голосов
/ 31 декабря 2008

Я бы не бросил исключение в этом случае. Если свойство является строкой, то я могу установить его на "" или ноль. Исключение должно быть выдано, когда я пытаюсь использовать это свойство (как в функции Connect ()), с сообщением, указывающим, что функция не выполнена, поскольку свойство недопустимо.

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