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

Nikolay Mishin mi на ya.ru
Пн Окт 28 14:51:52 PDT 2013


Андрей, спасибо, да действительно Try::Tiny работает,
вот 2 теста
с eval
https://github.com/mishin/gists/blob/master/test_ff1.pl
c Try::Tiny
https://github.com/mishin/gists/blob/master/test_ff1_try.pl
действительно ошибки ловятся,
но все равно
в 5.18 perlcritic -5 требует использования 
Error.pm 
а как написать на нем error class ума не приложу,
все примеры в документации какие-то не выразительные
может кто умеет?

29.10.2013, 01:10, "Андрей Асякин" <asan999 на gmail.com>:
> $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/CORION/WWW-Mechanize-Firefox-0.74/lib/WWW/Mechanize/Firefox.pm
>> внутри себя ипользует
>> useCarpqw(carp croak );
>> и, таким образом, все ошибки пролетают мимо Try::Tiny
>> - их невозможно поймать,
>> в общем я их обрабатываю, как в тестах к модулю
>> https://metacpan.org/source/CORION/WWW-Mechanize-Firefox-0.74/t/50-mech-new.t
>>
>> хоть Try::Tiny я и люблю, но, когда нужно написать
>> что-нибудь рабочее - плюешь на Perl Best Practice
>> и пишешь, чтоб работало
>> --
>> С уважением
>> Николай Мишин
>
> ,
> --
> Moscow.pm mailing list
> moscow-pm на pm.org | http://moscow.pm.org

-- 
С уважением
Николай Мишин



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