Думаю, вы перепутали с деструкторами. Выброс исключений в деструкторах чаще всего запрещён, именно по причине неопределённости дальнейшего поведения.<div><br></div><div>В конструкторах выброс исключений считается вполне обычной практикой (типично на C++, C#, иногда встречал в Ruby).<br>
<br><div class="gmail_quote">16 июля 2012 г., 10:23 пользователь Alexandr Alexeev <span dir="ltr"><<a href="mailto:afiskon@gmail.com" target="_blank">afiskon@gmail.com</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Насколько я знаю, бросать исключения в new() считается плохой практикой во всех языках. Если объект построен не до конца, значит его нельзя ни использовать (по понятным причинам), ни уничтожить (потому что он не был инициализирован должным образом и может содержать указатели в никуда и тп).<div>
<br></div><div>Возможно, вам следует подумать получше над интерфейсом. Например, вы можете использовать что-то вроде фабрики, которая перед созданием объекта проверяет все аргументы и вызывает конструктор только в том случае, если все они верны.<br>
<br><div class="gmail_quote">14 июля 2012 г., 15:13 пользователь Матюхин Вячеслав <span dir="ltr"><<a href="mailto:me@berekuk.ru" target="_blank">me@berekuk.ru</a>></span> написал:<div><div class="h5"><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Наверное, самый простой способ — не нарушать стандартную конвенцию "new всегда возвращает объект", а сделать отдельный метод.<br>
<br>
sub try_new {<br>
my $class = shift;<br>
return undef unless $condition;<br>
return $class->new(@_);<br>
}<br>
<br>
my $obj_or_undef = Foo->try_new(...);<br>
<br>
14.07.2012, 14:24, "Ivan Petrov" <<a href="mailto:i.petro.77.00@gmail.com" target="_blank">i.petro.77.00@gmail.com</a>>:<br>
<div><div>> есть нужда создать "мягкий" вариант конструктора, который будет<br>
> возвращать 'undef' в случае неудачи.<br>
><br>
> во всех хауту по Mouse/Moose пишут "не переопределяйте new"<br>
><br>
> соответственно если пытаться сделать это в BUILDARGS<br>
><br>
> sub BUILDARGS {<br>
> my $class = shift;<br>
><br>
> ..<br>
><br>
> return undef unless $condition;<br>
><br>
> return {<br>
> abc => 'cde',<br>
> cde => ...<br>
> }<br>
> }<br>
><br>
> то Mouse ругается что не хеш мы возвращаем<br>
><br>
> c другой стороны определив new<br>
><br>
> sub new {<br>
> my ($class, @args) = @_;<br>
> ...<br>
> return undef unless $condition;<br>
> return $self->SUPER::new({ abc => 'cde', cde => ... });<br>
> }<br>
><br>
> я добиваюсь чего хочу, но на такой пакет нелья поставить<br>
> make_immutable поскольку мой new оно заменит своим<br>
><br>
> выбрасывать исключение в BUILDARGS я не хочу, хочу вернуть undef.<br>
><br>
> как правильно поступить?<br>
><br>
> --<br>
> Moscow.pm mailing list<br>
> <a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
</div></div></blockquote></div></div></div><span class="HOEnZb"><font color="#888888"><br><br clear="all"><div><br></div>-- <br>С уважением, Александр<br>Личный блог: <a href="http://eax.me/" target="_blank">http://eax.me/</a><br>
Мой форум: <a href="http://it-talk.org/" target="_blank">http://it-talk.org/</a><br>
Мой Twitter: <a href="http://twitter.com/afiskon" target="_blank">http://twitter.com/afiskon</a><br><br>
</font></span></div>
<br>--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" target="_blank">http://moscow.pm.org</a><br>
<br></blockquote></div><br></div>