У меня есть класс, который выглядит следующим образом:Где следует исключать исключения?
public class StackOverflowQuestion {
private string _question;
public string Question {
get { return _question; }
set { _question = value; }
}
public StackOverflowQuestion(string question) {
_question = question;
}
public override string ToString() {
return _question;
}
}
Теперь, «вопрос» значение не может быть нулевым или пустым, и пользователь должен быть уведомлен через ArgumentNullException - но там, где оно должно было бросили? Согласно принципу «неудачный» -> везде.
public class StackOverflowQuestion {
private string _question;
public string Question {
get { return _question; }
set {
if(!String.IsNullOrEmpty(value))
_question = value
else throw new ArgumentNullException("value");
}
}
public StackOverflowQuestion(string question) {
if(!String.IsNullOrEmpty(question))
_question = question;
else throw new ArgumentNullException("question");
}
public override string ToString() {
if(!String.IsNullOrEmpty(_question)) return _question;
else throw new ArgumentNullException("_question");
}
}
Теперь это, очевидно, нелепо и чрезвычайно повторяемо. Но это кажется правильным: если значение установлено через .ctor, он выходит из строя сразу после короткой проверки. Когда он устанавливается через свойство, он терпит неудачу сразу после короткой проверки .. но кто ожидает исключений из сеттера? И когда я выводя строку, я ожидаю, что строка, а не исключение для чего-то, что должно было произойти давно, но опять же: если это не так, оно должно потерпеть неудачу, даже если «скоро» довольно поздно.
Итак, где должна выполняться обработка исключительных ситуаций? Я прошу о «лучшей практике», или это вкус?
ToString не должен бросить исключение –
Вы можете уточнить, почему нет? – Atrotygma
@Atrotygma: Потому что он никогда не может попасть в это состояние ... –