Обработка исключений в наборе / получении свойства - PullRequest
1 голос
/ 08 июля 2010

В приведенном ниже примере кода я беру список строк и объединяю их в строку с разделителями.Проблема возникает, когда я использую сеттер с пустым списком.Метод ToString создает исключение ArgumentOutOfRangeException, поскольку вторым параметром является -1.

Как должны обрабатываться такие условия (исключения, генерируемые в методах получения / установки), как это?

IМне не нравится тот факт, что установщик выдает исключение, так как вызывающая сторона не знает о внутренностях класса и поэтому не должна обрабатывать (или даже не знать, как) исключение.Поймать все исключения в получателе / ​​установщике и спокойно обработать их также звучит как плохая идея, так как вызывающий не узнает, что получатель / установщик вышел из строя.

//I realize that this isn't the best code but I wanted to produce an example
//to demonstrate my question.
private string theStringVariable;
const string DELIMITER = ",";

public IList<string> StringList
{
   set
   {
      StringBuilder stringBuilder = new StringBuilder();
      foreach(string entry in value)
      {
         stringBuilder.Append(entry);
         stringBuilder.Append(DELIMITER);
      }
      theStringVariable = stringBuilder.ToString(0, stringBuilder.Length - 1);
   }
}

Ответы [ 4 ]

6 голосов
/ 08 июля 2010

Вы должны проверить наличие потенциальных, распространенных ошибок и сразу же выдать собственное исключение (до ошибок StringBuilder) со значимым сообщением об ошибке.

В вашем случае вы, скорее всего, захотите использовать некоторую форму ArgumentException, если сеттер вызывается со списком пустых строк. Ключевым моментом здесь является то, что ваше исключение может сказать «аргумент содержал пустую коллекцию» вместо «индекс вне границ», что немедленно заставит вызывающего понять, почему у них есть «реальная» проблема в их вызове. 1003 *


На заметку: в тех случаях, как код, который вы разместили - я бы также подумал о том, чтобы сделать это методом, а не свойством. Вы выполняете довольно большую «работу» в этом установщике свойств, что будет несколько неожиданно. Сделав этот метод, вы дадите пользователю подсказку, что в этом свойстве происходит небольшая «обработка» ...

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

Я не думаю, что ваши проблемы связаны с лучшими практиками.

Лучшая практика, которую вам нужно наблюдать в вашем случае - это строка, которая гласит

 stringBuilder.ToString(0, stringBuilder.Length - 1);

Вы вызываете исключение, не проверяя длину строки. Если ваша длина равна 0, просто верните пустую строку.

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

Однако * иногда лучше внезапно / громко потерпеть неудачу, чем тихо потерпеть неудачу.

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

Код завершен предлагает, если вы можете обработать исключение локально, то, что вы делаете так: «Не используйте исключение, чтобы пройти бакс». В данном примере это будет означать проверку на пустое значение и обработать его соответствующим образом в установщике.

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

Прежде всего, если вы можете обнаружить кого-то, кто может вызвать исключение - исправьте это, чтобы исключение не происходило.В этом случае проверьте наличие пустого списка перед циклом и установите переменную соответствующим образом.

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

(*) Только Catchто, что вы ожидаете, может произойти - пусть неожиданное всплывет пользователю.

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