[Moscow.pm] обработка ошибок в perl

Андрей Асякин asan999 на gmail.com
Пн Окт 28 14:09:39 PDT 2013


$ERRNO это $!, а ни $@, а в Try::Tiny вроде $_ используется:

  perl -MCarp -MTry::Tiny -E 'try { croak "aaaaa" } catch { say "XXX: $_" }'

так что все работает

29.10.2013 0:04, Nikolay Mishin пишет:
> MoscowPM, привет,
> ну и напоследок перед сном;))
> Нужно мне было, если не запущен firefox, то запустить его, пишу 
> (https://github.com/mishin/gists/blob/master/trans.pl
>  100-133)
>     my $url = 'http://www.translate.ru/';
>     my $firemech;
>
>     my $lived = eval {
>         $firemech = WWW::Mechanize::Firefox->new( tab => qr/PROMT/sm, );
>         1;
>     };
>     my $err = $ERRNO;    # $@;
>
>     given ($err) {
>
> #Failed to connect to , problem connecting to "localhost", port 4242: 
> Connection refused at /usr/local/share/perl/5.14.2/MozRepl/Client.pm 
> line 144
>         when (/\QFailed to connect to , problem connecting to\E/xsm) {
>
>   #        use Test::More;
>   #         is $lived, undef, 'We died trying to connect to a 
> non-existing tab';
>   #         like $err, q{/Couldn't find a tab matching/},
>   #           'We got the correct error message';
>             my $path_to_firefox =
>               os_is('MSWin32')
>               ? 'C:/Program Files (x86)/Mozilla Firefox/firefox.exe'
>               : '/usr/bin/firefox';
>             $firemech = WWW::Mechanize::Firefox->new(
>                 tab    => 'current',
>                 launch => $path_to_firefox
>             );
>             $firemech->get($url) or die "Cannot connect to $url\n";
>         }
>
>         #Couldn't find a tab matching /(?^ums:PROMT)/ at trans.pl line 
> 100.
>         when (/\QCouldn't find a tab matching\E/xsm) {
>             say 'we match error' . $_;
>             $firemech = WWW::Mechanize::Firefox->new( tab => 'current', );
>             $firemech->get($url) or die "Cannot connect to $url\n";
>         }
>     }
> Так вот никакой Try:;Tiny ни Error.pm
> мне не помог, как это под них переписать
> я не пойму, чтобы работало
> Error.pm - вообще классы ошибок надо строить,а  как не ясно
> в общем по старинке ловлю ошибки эвалом eval
> дело в том еще, что WWW::Mechanize::Firefox 
> <https://metacpan.org/source/WWW::Mechanize::Firefox>
> https://metacpan.org/source/CORION/WWW-Mechanize-Firefox-0.74/lib/WWW/Mechanize/Firefox.pm
> внутри себя ипользует
> useCarp <https://metacpan.org/source/Carp>qw(carp croak );
> и, таким образом, все ошибки пролетают мимо Try::Tiny
> - их невозможно поймать,
> в общем я их обрабатываю, как в тестах к модулю
> https://metacpan.org/source/CORION/WWW-Mechanize-Firefox-0.74/t/50-mech-new.t
> хоть Try::Tiny я и люблю, но, когда нужно написать
> что-нибудь рабочее - плюешь на Perl Best Practice
> и пишешь, чтоб работало
> -- 
> С уважением
> Николай Мишин
>
>

----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20131029/1d7b0c8f/attachment-0001.html>


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