in reply to Re: handling WWW::Mechanize Error GETing
in thread handling WWW::Mechanize Error GETing

Small (but essential) correction to jeffa's answer: The terminating semi-colon should be outside the eval braces otherwise perl throws a (unhelpful) compilation error. eval { $mech->get($imgsrc) }; if ($@) { # alert the error }
  • Comment on Re^2: handling WWW::Mechanize Error GETing

Replies are listed 'Best First'.
Re^3: handling WWW::Mechanize Error GETing
by Anonymous Monk on Dec 28, 2016 at 22:40 UTC

    Hi,

    Using if($@) is unreliable,

    The correct pattern is

    $temp = eval { $mech->get($imgsrc) }; if( not $temp ){ ... }

    But we're using mech so we dont need to store the response in $temp

    So even better

    eval { $mech->get( $imgsrc ); }; if( not $mech->res->is_success ){ ... }

    Or even better

    if( not eval { $mech->get( $imgsrc ); 1 } ){ ... }

    Or simply the generic version , it doesn't rely on $@

    eval { $mech->get( $imgsrc ); 1 } or do { ... };

    For explanation why using if($@) is unreliable see Devel::EvalError -- Reliably detect if and why eval() failed

      Hi,

      In general you are right about eval { ...; 1 } or do { ... } being better than eval { ... }; if ($@) { ... }, however note this

      eval { $mech->get( $imgsrc ); }; if( not $mech->res->is_success ){ ... }

      is quite different from all the other snippets of code so far: it only checks $mech->res->is_success, as opposed to all the other examples which would report any error inside an eval, so personally I'd recommend those other patterns over this particular example.

      Regards,
      -- Hauke D

        :) All the code is incomplete , none reports any errors  "# alert the error" is a comment, $mech contains all the parts needed to make up the error message ... but the OP just wanted to avoid dying and give it another url, so :)