Steve_BZ has asked for the wisdom of the Perl Monks concerning the following question:

Hi Guys,

Having set the $Email::Valid::Response timeout parameter, when it fails the programme crashes, together with the calling app, like this:

query timed out at /usr/local/share/perl/5.18.2/Email/Valid.pm line 14 +7. Email::Valid::_net_dns_query('Email::Valid', 'sca-uk.com') called +at /usr/local/share/perl/5.18.2/Email/Valid.pm line 236 Email::Valid::mx(undef, 'sca-uk.com') called at /usr/local/share/p +erl/5.18.2/Email/Valid.pm line 376 Email::Valid::address(undef, '-address', 'steve.cookson@sca-uk.com +', '-mxcheck', 1, '-tldcheck', 1) called at /home/image/Documents/i_C +ommon/i_Post_Exam.pm line 1560 i_Post_Exam::on_click_email_report('i_Post_Exam=HASH(0x8fb6a88)', +'Wx::CommandEvent=SCALAR(0x8f82ad8)') called at /home/image/Documents +/Endoscopia/i_Schedule.pm line 661 eval {...} called at /home/image/Documents/Endoscopia/i_Schedule.p +m line 661 i_Schedule::__goto_report('Wx::Dialog=HASH(0x8f55eb8)', 'Wx::ListE +vent=SCALAR(0x8f85f28)') called at i-Mage.pl line 320 eval {...} called at i-Mage.pl line 320 i_Mage::__ANON__('i_Mage=HASH(0x8949000)', 'Wx::CommandEvent=SCALA +R(0x8f53cc0)') called at i-Mage.pl line 1120 eval {...} called at i-Mage.pl line 1120

What can I do to make it return an error code rather than just crashing?

Regards

Steve

Replies are listed 'Best First'.
Re: Dealing with Email::Valid timeout
by McA (Priest) on Nov 26, 2014 at 15:19 UTC

    Hi,

    the documentation of Email::Valid mentions the fact that an exception could be thrown. Therefor it's part of the API. To cite the relevant part:

    If an error is encountered, an exception is raised. This is really only possible when performing DNS queries. Trap any exceptions by wrapping the call in an eval block:

    McA

      And that is what I haven't done.

      Thanks, I'll do it.

      Regards

      Steve

Re: Dealing with Email::Valid timeout
by Eily (Monsignor) on Nov 26, 2014 at 14:47 UTC

    I didn't see any mention of $Email::Valid::Response in Email::Valid, and the only timeout mentionned here is the tcp timeout of Net::DNS::Resolver, I suppose that's what you're talking about.

    The error should be caught by the eval line 661 in i_Schedule.pm, if you want to catch it sooner, just add another eval sooner. As a matter of fact, the idiom:

    eval { success() or die(); }; if ($@) { complain() and cleanUp(); }
    is the core-perl equivalent to the try/catch pair that you may find in other languages.

    eval { Email::Valid::address(@params) }; # i_Post_Exam.pm line 1560 if ($@) { warn "I haz got an error"; }
    should do the trick

      May I add the links to the lightweight Try::Tiny and it's heavyweight brother TryCatch. These two are often mentioned in combination with exception handling. But be careful: The behaviours of these two are little different.

      McA

      Eily,

      I currently have:

      for (my $i=0;$i<@loc_email_list;$i++){ # Set timeout in seconds to avoid excessive delays and + crashing. my $valid_email_address = Email::Valid->new(); $Email::Valid::Resolver->tcp_timeout(10); my $valid = Email::Valid->address(-address => $loc_ema +il_list[$i], -mxcheck => 1, -tldcheck => 1 ) ? '1' : '0'; if (length ($loc_email_list[$i]) == 0 or not $valid){ __message(__t("You must enter a valid email 'to' a +ddress."), $dialog_1); $dialog_1->{Ctl_Dialog_Email_To_Txt}->SetFocus; redo SHOW; }; }

      There is no eval there, in spite of what Carp says, but I guess you are saying there should be.

      It's what McA says too.

      Thanks and regards.

      Steve.

        Well, I suppose that's your i_Post_Exam.pm file I suppose, Carp never indicated any eval there. And indeed, I'm telling you to add one, eval being the way to turn die (or similar functions) into an error (which can be read in the special variable $@). You can also use one of the modules McA talked about, which may make the code closer to what you expect or are used to.