in reply to VB "On Error" Equivalent in Perl

Check out Conway's Perl Best Practices. From Chapter 13: Error Handling, Section Recoverable Failure, we find the following technique:
use Carp qw(croak); use English qw(-no_match_vars); use Net::FTP; use Time::HiRes qw(sleep); use strict; my $MAX_TRIES = 15; my $ftp; TRY: for my $try (1..$MAX_TRIES) { # If successful, we're done. eval { $ftp = Net::FTP->new("some.host.name", Debug => 0) or die "Cannot connect to some.host.name: $@"; last TRY; }; # Report non-recoverable failure if no more tries croak( $EVAL_ERROR ) if $try == $MAX_TRIES; # Try again after a nap (approximate fibonacci) sleep( rand (1.618 ** $try) ); }
- Miller

Update: Missing Semi-colon.

Replies are listed 'Best First'.
Re^2: VB "On Error" Equivalent in Perl
by erroneousBollock (Curate) on Nov 29, 2007 at 01:28 UTC
    eval { $ftp = Net::FTP->new("some.host.name", Debug => 0) or die "Cannot connect to some.host.name: $@"; last TRY; }
    I'm curious about your use of $@ om the second line of the eval. How would $@ be set without causing an exception that would throw control outside the eval?

    If the die "Cannot ..." ever occurs, wouldn't $@ be empty?

    Surely $@ is only useful outside the eval?

    Also, eval {} is a statement and should be followed by a semicolon if further statements are to follow in the current block. Your code doesn't compile.

    -David

      That is explained in the documentation for Net::FTP.
      If the constructor fails undef will be returned and an error message will be in $@.
      All other Net::FTP methods save their error message in $ftp->message.

      I've also sometimes wondered about the logic of this. Nevertheless, that's the way it is.

      - Miller