Это - хорошая практика для помещения обработки исключений в конструктора?

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

13
задан froadie 3 February 2010 в 19:17
поделиться

7 ответов

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

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

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

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

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

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

9
ответ дан 1 December 2019 в 21:52
поделиться

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

3
ответ дан 1 December 2019 в 21:52
поделиться

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

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

2
ответ дан 1 December 2019 в 21:52
поделиться

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

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

(*) До тех пор, пока вы не принадлежите к секте. который избегает исключений в C++

4
ответ дан 1 December 2019 в 21:52
поделиться

В C ++ ctors лучше всего подходят для резервного копирования исключений. FAQ: 17.2

3
ответ дан 1 December 2019 в 21:52
поделиться

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

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

3
ответ дан 1 December 2019 в 21:52
поделиться

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


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

0
ответ дан 1 December 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: