[Moscow.pm] AnyEvent: die внутри коллбека

Вадим Власов scripter.vrn на gmail.com
Вт Авг 20 09:25:18 PDT 2013


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

20 августа 2013 г., 19:59 пользователь Mons Anderson <mons на cpan.org>написал:

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



----
  С уважением,
  Вадим Власов
  т.: +7 (916) 424-00-72
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20130820/375fb449/attachment-0001.html>


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