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

Mons Anderson mons на cpan.org
Вт Авг 20 08:59:13 PDT 2013


Во первых считаю плохим тоном несколько коллбеков - успешный и неуспешный.
Порождает массу ошибок.
хороший вариант имхо

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