snehit.ar has asked for the wisdom of the Perl Monks concerning the following question:

Getting an timeout error while trying to pull http data in xml format. I want if timeout happen it should not append to "events.xml" and keep the existing "events.xml" unchanged.

So need help to understand the error handling in perl and how to manage that if (failed) { DO Nothing } else (run the working code) { Do something }..

Error:

D:\Development\BVD DCSS Dashboard>perl getDataDCSS.pl syntax error at line 1, column 0, byte 0: read timeout at C:/strawberry/perl/site/lib/Net/HTTP/Methods.pm line 2 +68. ^ at C:/strawberry/perl/site/lib/XML/Parser.pm line 187. D:\Development\BVD DCSS Dashboard>

Here is my code to perform that

#!/usr/bin/env perl use warnings; use strict; #use HTTP::Request::Common qw(GET); use LWP::UserAgent; use DateTime; use DateTime::Format::Strptime; use Cpanel::JSON::XS qw(encode_json); ## Variable Definition my $dtnow = DateTime->now; my $twoWeeksAgo = DateTime->now->subtract(weeks => 2); ## Date used t +o pull events data from today – 2 weeks. my $resp; my $request; ## Get events from OMi ## my $omi_url="https://omi.test.com/opt-web/rest/9.10/event_list/?qu +ery=title%20LIKE%20%22logtec(100)%25%22&watermark=$twoWeeksAgo%2B02:0 +0"; my $user="username"; my $password="*******"; #print "$omi_url\n"; my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 0 } +, );; $ua->credentials('omi.test.com:544','HP Operations Manager i',$use +r,$password); $request = HTTP::Request->new(GET => $omi_url); $resp = $ua->request($request); $resp->is_success or die $resp->status_line; print $resp->as_string; open(my $fh, '>', 'events.xml'); print $fh $resp->content; close $fh; ## End ###

Replies are listed 'Best First'.
Re: Error handling
by thanos1983 (Parson) on Aug 04, 2017 at 12:21 UTC

    Hello snehit.ar,

    I have not used this module before, but from the point that I see most likely you have an error on your code or sign in with the credentials.

    From the documentation:

    verify_hostname => $bool When TRUE LWP will for secure protocol schemes ensure it connects to s +ervers that have a valid certificate matching the expected hostname. +If FALSE no checks are made and you can't be sure that you communicat +e with the expected peer. The no checks behaviour was the default for + libwww-perl-5.837 and earlier releases.

    I see on your code you have:

    my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 0 }, );

    Why? Are you sure you can communicate with the remote host?

    Provide us a bit more information.

    Seeking for Perl wisdom...on the process of learning...not there...yet!
      yes i am able to access the host with the credentials . I'm also able to open the url from the browser with the same credentials .
      my $omi_url="https://omi.test.com/opt-web/rest/9.10/event_list/?qu +ery=title%20LIKE%20%22logtec(100)%25%22&watermark=$twoWeeksAgo%2B02:0 +0"; my $user="username"; my $password="*******";

      Below i have the timeout exception pls check if its correct or any other way around

      ## Get events from OMi ## my $omi_url="https://omi.test.com/opt-web/rest/9.10/event_list/?qu +ery=title%20LIKE%20%22logtec(100)%25%22&watermark=$twoWeeksAgo%2B02:0 +0"; my $user="username"; my $password="*******"; #print "$omi_url\n"; my $ua = LWP::UserAgent->new( ssl_opts => { verify_hostname => 0 } +, );; $ua->credentials('omi.test.com:544','HP Operations Manager i',$use +r,$password); $request = HTTP::Request->new(GET => $omi_url); $ua->timeout(300); $resp = $ua->request($request); if ($resp->is_success) { # print $resp->as_string; open(my $fh, '>', 'events.xml'); # print $fh $resp->content; close $fh; } else { print "Error: " . $resp->status . "\n"; } ## End ###

      Please check .Thank you

Re: Error handling
by stevieb (Canon) on Aug 04, 2017 at 21:32 UTC

    You can use eval to catch, and then do alternate tasks:

    use warnings; use strict; my $ok = eval { blah() or die "damn thing failed!"; 1; }; if ($ok){ print "success\n"; } else { print "failed, doing something else\n"; } sub blah { # simulate a fail return 0; }

    Now, the error will be in $@, but because there are situations where it can be reset before you get to it, it can be risky to do things like this:

    eval { blah() or die "failed"; }; if ($@){ ... }

    Regarding my first full example above, if an exception is thrown within the eval, it'll set $ok to undef, otherwise if all of the statements execute successfully, the 1 (ie. true) will be returned.

    Inside of the else block, you could check to see what the error is:

    if ($@ =~ /timeout/){ ... }

    ...but again, it's not wise to solely rely on that variable in all cases.

Re: LWP Error handling (WWW::Mechanize)
by Anonymous Monk on Aug 04, 2017 at 21:41 UTC

    Hi,

    WWW::Mechanize is a convenient subclass of LWP::UserAgent with nice error checking , by default it dies if request fails, like on a timesout, so your program can be simple like

    #!/usr/bin/perl -- use strict; use warnings; use WWW::Mechanize 1.86; ... # your other modules Main( @ARGV ); exit( 0 ); sub Main { my $user = ... GetSaveOMI( $user, $password , 'events.xml' ); } sub GetSaveOMI { my( $user, $password, $outfile ) = @_; my $omi_url = ...; my $ua = WWW::Mechanize->new( ... ); $ua->get( $omi_url , ':content_file' => $outfile ); ## regular LWP + usage return $ua; }
A reply falls below the community's threshold of quality. You may see it by logging in.