On Thu, Jun 30, 2005 at 09:05:00AM -0600, Wiggins d'Anconia wrote:
> Peter Rabbitson wrote:
> > Hello everyone, 
> > Here and there on the web I encounter claims that the do {} operator is 
> > depreciated. However I find it convenient to do things like:
> > 
> > eval { some stuff } or do { some multiline error handling };
> > 
> > is this a bad practice?
> > 
> > Thanks
> > 
> > Peter
> > 
> > 
> 
> Didn't see anything about 'do' being deprecated in the perldoc -f do or
> perldoc perlsyn docs. Though do SUBROUTINE was stated as deprecated.
> The problem (IMHO) with the above is that you can't return a positive
> value from the eval and you haven't error checked whether there was an
> exception thrown, which is one of the more common reasons to use an eval
> in the first place. So I guess my question is, why are you using the
> eval to begin with?
> 
> my $return = eval { some stuff };
> if ($@) {
>   rethrow or handle "Eval failed with: $@";
> }
> unless ($return) {
>   some multiline error handling;
> }
> 
> The problem is that eval returning a false/undefined value shouldn't
> necessarily have to indicate failure. And if the 'eval' isn't catching
> an exception then there is really no reason to use it in the first place.
> 

I am sorry, I wasn't clear enough. I am aware of eval returning the last 
statements return value, thus the possibility of having an undef result. 
I am using it exclusively for control of "do or die" tasks, as DBI 
operations for example, where even if it returns 0 it still evalutes 
true. The reason I do () an entire block is because I specify additional 
error messages. Like this:

my $dsn = join (':',    'DBI',
                        $cfg->{engine},
                        join (';', "database=$cfg->{database_name}",
                                   "host=$cfg->{host}",
                                   "port=$cfg->{port}",
                          ),
         );

my $dbh;
eval { $dbh = DBI->connect ($dsn, $auth->{user}, $auth->{pass}, {   
                                        AutoCommit => 0,
                                        RaiseError => 1,
                                        PrintError => 0,
                                    }
                      )
}
or do {
  $ERROR = "Unable to connect to '$dsn':\n" . ($DBI::errstr || 'Unknown error');
  return undef;
};

return $dbh;

Thanks for the feedback

Peter

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to