<div dir="ltr">Эх, я так надеялся на какой-нибудь волшебный простой способ.<div>Альтернатива on_error-у интересная, но к сожалению уже много кода написано с двумя коллбеками. Какого рода ошибки провоцирует такой стиль? Мне приходит в голову только что on_error бывает далеко не везде и его обязательность неочевидна - можно вполне забыть передать, что вылезет только в рантайме в самый неподходящий момент.</div>


<div class="gmail_extra"><br><div class="gmail_quote">20 августа 2013 г., 19:59 пользователь Mons Anderson <span dir="ltr"><<a href="mailto:mons@cpan.org" target="_blank">mons@cpan.org</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


Во первых считаю плохим тоном несколько коллбеков - успешный и неуспешный.<br>
Порождает массу ошибок.<br>
хороший вариант имхо<br>
<br>
do_async_call(sub {<br>
  if (defined $_[0]) {<br>
   #it's ok<br>
  }<br>
  else {<br>
   # error in $_[1]<br>
  }<br>
})<br>
<br>
<br>
Во вторых:<br>
Да, любой синхронный вызов с потенциальным die оборачивается в eval;<br>
<br>
eval { sync_call() ;1 } or return $cb->(undef, $@);<br>
<br>
…<br>
sub_call(… sub {<br>
 defined $_[0] or return $cb->(undef, $_[1]);<br>
});<br>
<br>
В третьих: EV::DIED<br>
Это на случай если все-таки где-то что-то провтыкалось.<br>
при этом лучше сделать EV::unloop и перезапустить процесс, т.к. иначе велика вероятность, что все зависнет в каком-нибудь некондиционном состоянии.<br>
<div><div><br>
<br>
On 20.08.2013, at 18:41, Вадим Власов <<a href="mailto:scripter.vrn@gmail.com" target="_blank">scripter.vrn@gmail.com</a>> wrote:<br>
<br>
> Добрый вечер всем.<br>
><br>
> Может кто знает, есть ли способ для AE ловить ошибку там, где объявлен коллбек?<br>
> А то постоянно приходится потенциально опасные места всех коллбеков eval-ить и с самого верху везде передавать коллбек on_error, для сообщения об ошибке вызывающему.<br>
> Как кто вообще с такой проблемой справляется?<br>
><br>
> Пример:<br>
><br>
> do_async_call(<br>
>   on_done => sub { say "yahoo!" },<br>
>   on_error => sub { $log->write( $_[0] ) },<br>
> );<br>
><br>
> sub do_async_call {<br>
>   my $self = shift;<br>
>   my ($data, %cb) = @_;<br>
><br>
>   eval {<br>
>     if ( $self->{some_flag} ) {<br>
>       $self->_get_new_data(<br>
>         on_done => sub {<br>
>           $self->_sync_save_data( $_[0] );  # <<<< die внутри AE, нужно тоже eval-ить<br>
>         },<br>
>         on_error => $cb{on_error},<br>
>     }<br>
>     else {<br>
>       $self->_sync_save_data( $data );     # <<<< die в eval-е, все ок<br>
>     }<br>
>   };<br>
>   if ($@) {<br>
>     AE::postpone { $cb{on_error}->( "can't do async call: $@" ) };<br>
>   }<br>
><br>
>   return;<br>
> }<br>
><br>
> sub _sync_save_data {<br>
>   die "can't save data";<br>
> }<br>
><br>
> ----<br>
>   С уважением,<br>
>   Вадим Власов<br>
>   т.: +7 (916) 424-00-72<br>
</div></div><div><div>> --<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>
--<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><br><br clear="all"><div><br></div>----<br><div dir="ltr"><div>  С уважением,<br></div><div>  Вадим Власов</div><div>  т.: +7 (916) 424-00-72</div></div>
</div></div>