[Moscow.pm] Moose | Mouse вопрос

Akzhan Abdulin akzhan.abdulin на gmail.com
Вс Июл 15 23:54:07 PDT 2012


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

В конструкторах выброс исключений считается вполне обычной практикой
(типично на C++, C#, иногда встречал в Ruby).

16 июля 2012 г., 10:23 пользователь Alexandr Alexeev <afiskon на gmail.com>написал:

> Насколько я знаю, бросать исключения в new() считается плохой практикой во
> всех языках. Если объект построен не до конца, значит его нельзя ни
> использовать (по понятным причинам), ни уничтожить (потому что он не был
> инициализирован должным образом и может содержать указатели в никуда и тп).
>
> Возможно, вам следует подумать получше над интерфейсом. Например, вы
> можете использовать что-то вроде фабрики, которая перед созданием объекта
> проверяет все аргументы и вызывает конструктор только в том случае, если
> все они верны.
>
> 14 июля 2012 г., 15:13 пользователь Матюхин Вячеслав <me на berekuk.ru>написал:
>
> Наверное, самый простой способ — не нарушать стандартную конвенцию "new
>> всегда возвращает объект", а сделать отдельный метод.
>>
>> sub try_new {
>>     my $class = shift;
>>     return undef unless $condition;
>>     return $class->new(@_);
>> }
>>
>> my $obj_or_undef = Foo->try_new(...);
>>
>> 14.07.2012, 14:24, "Ivan Petrov" <i.petro.77.00 на gmail.com>:
>> > есть нужда создать "мягкий" вариант конструктора, который будет
>> > возвращать 'undef' в случае неудачи.
>> >
>> > во всех хауту по Mouse/Moose пишут "не переопределяйте new"
>> >
>> > соответственно если пытаться сделать это в BUILDARGS
>> >
>> > sub BUILDARGS {
>> >     my $class = shift;
>> >
>> >     ..
>> >
>> >     return undef unless $condition;
>> >
>> >     return {
>> >             abc => 'cde',
>> >             cde => ...
>> >     }
>> > }
>> >
>> > то Mouse ругается что не хеш мы возвращаем
>> >
>> > c другой стороны определив new
>> >
>> > sub new {
>> >     my ($class, @args) = @_;
>> >     ...
>> >     return undef unless $condition;
>> >     return $self->SUPER::new({ abc => 'cde', cde => ... });
>> > }
>> >
>> > я добиваюсь чего хочу, но на такой пакет нелья поставить
>> > make_immutable поскольку мой new оно заменит своим
>> >
>> > выбрасывать исключение в BUILDARGS я не хочу, хочу вернуть undef.
>> >
>> > как правильно поступить?
>> >
>> > --
>> > Moscow.pm mailing list
>> > moscow-pm на pm.org | http://moscow.pm.org
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>>
>
>
>
> --
> С уважением, Александр
> Личный блог: http://eax.me/
> Мой форум: http://it-talk.org/
> Мой Twitter: http://twitter.com/afiskon
>
>
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org
>
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20120716/38fa0b09/attachment.html>


Подробная информация о списке рассылки Moscow-pm