Это хорошая практика, чтобы поместить обработку исключений в конструктор? - PullRequest
13 голосов
/ 03 февраля 2010

Законно ли иметь код обработки исключений в конструкторе классов или его следует избегать? Следует ли избегать использования кода, генерирующего исключения, в конструкторе?

Ответы [ 7 ]

9 голосов
/ 03 февраля 2010

Да, это вполне разумно. Как еще у вас могут быть такие обстоятельства:

class List {
    public List(int length) {
        if(length < 0) {
            throw new ArgumentOutOfRangeException(
                "length",
                "length can not be negative"
            );
        }
        // okay, go!
    }
}

A List с отрицательной длиной, безусловно, является исключительным. Вы не можете позволить этому вернуться к звонящему и заставить его думать, что строительство прошло успешно. Какая альтернатива, CheckIfConstructionSucceeded функция-член экземпляра? Yucky.

Или как насчет

class FileParser {
    public FileParser(string path) {
        if(!File.Exists(path)) {
            throw new FileNotFoundException(path);
        }
        // okay, go!
    }
}

Опять же, это бросок, и ничто другое не приемлемо.

4 голосов
/ 03 февраля 2010

Предполагая, что это C ++, о котором вы говорите, вызов исключений - фактически единственный способ сигнализировать об ошибках в конструкторе, поэтому этого определенно не следует избегать (*)

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

(*) Пока ты не из культа что позволяет избежать исключений в C ++

3 голосов
/ 03 февраля 2010

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

Это добавляет еще один уровень сложности в конструктор, так как вы должны убедиться, что все инициализировано правильно, даже если ошибка действительно возникает, но это лучше, чем с ошибочным кодом:)

3 голосов
/ 03 февраля 2010

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

3 голосов
/ 03 февраля 2010

В C ++ лучше всего размещать ctors для создания резервных копий исключений. FAQ: 17,2

2 голосов
/ 03 февраля 2010

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

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

0 голосов
/ 04 февраля 2010

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


Constructor(Param param){
  if(param == null)
    throw new IllegalArgumentException(...);
}

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