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

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

Replies are listed 'Best First'.
Re^4: handling WWW::Mechanize Error GETing
by haukex (Archbishop) on Dec 29, 2016 at 11:25 UTC

    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 :)