Возможно, необходимо рассмотреть Повышение. Мультииндекс , хотя примечание, что это немного слишком тяжело взвешивается.
Вызов исключений в __ init __ ()
абсолютно нормально. Другого хорошего способа обозначить состояние ошибки в конструкторе нет, и в стандартной библиотеке есть много сотен примеров, в которых построение объекта может вызвать исключение.
Класс ошибки, который нужно поднять, конечно, зависит от вас. . ValueError
лучше всего, если конструктору был передан недопустимый параметр.
Я не вижу причин, по которым это должно быть плохим тоном.
Напротив, одна из вещей, которые, как известно, работают хорошо, в отличие от возврата кодов ошибок, - это что коды ошибок обычно не могут возвращаться конструкторами. Так что, по крайней мере, в таких языках, как C ++, создание исключений - единственный способ сигнализировать об ошибках.
Стандартная библиотека говорит:
>>> f = file("notexisting.txt")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'notexisting.txt'
Также я действительно не вижу причин, по которым это следует считать плохим тоном.
Думаю, это идеальный случай для встроенного исключения ValueError
.
Я согласен со всем из вышеперечисленного.
На самом деле нет другого способа сигнализировать о том, что что-то пошло не так при инициализации объекта, кроме создания исключения.
В большинстве программных классов, где состояние класса полностью зависит от входных данных для этого класса, мы можем ожидать возникновения какой-либо ValueError или TypeError.
Классы с побочными эффектами (например, те, которые работают с сетью или графикой) могут вызвать ошибку в init, если (например) сетевое устройство недоступно или объект холста не может быть записан. Мне это кажется разумным, потому что часто вы хотите узнать об условиях отказа как можно скорее.