Эх, я так надеялся на какой-нибудь волшебный простой способ. Альтернатива on_error-у интересная, но к сожалению уже много кода написано с двумя коллбеками. Какого рода ошибки провоцирует такой стиль? Мне приходит в голову только что on_error бывает далеко не везде и его обязательность неочевидна - можно вполне забыть передать, что вылезет только в рантайме в самый неподходящий момент.
20 августа 2013 г., 19:59 пользователь Mons Anderson <[email protected]>написал: > Во первых считаю плохим тоном несколько коллбеков - успешный и неуспешный. > Порождает массу ошибок. > хороший вариант имхо > > 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, Вадим Власов <[email protected]> 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 > > [email protected] | http://moscow.pm.org > > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org > ---- С уважением, Вадим Власов т.: +7 (916) 424-00-72
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
