On Jan 18, 2008 2:45 PM, Andy Greenwood <[EMAIL PROTECTED]> wrote:
snip
> > $SIG{__DIE__} = sub {
> >     open my $fh, ">>", "something.log"
> >         or die @_, "could not open something.log: $!";
> >     print $fh @_;
> > };
> >
> > die "Oops";
> >
>
> Would this not be susceptible to infinite recursion if it fails to open
> something.log? Would it not be safer/better to do something like this
> (untested)?
snip

Did you try it?  Here, this code will trigger the recursion you are
worried about

#!/usr/bin/perl

use strict;
use warnings;

$SIG{__DIE__} = sub {
   open my $fh, ">>", "something.log"
       or die @_, "could not open something.log: $!";
   print $fh @_;
};

#create something.log if it doesn't exist
open my $fh, ">>", "something.log"
        or die "could not open something.log: $!";
close $fh;

chmod 0000, "something.log";

die "Oops";


And the reason it works is in perldoc perlvar:
               The routine indicated by $SIG{__DIE__} is called when a fatal
               exception is about to be thrown.  The error message is passed
               as the first argument.  When a __DIE__ hook routine returns,
               the exception processing continues as it would have in the
               absence of the hook, unless the hook routine itself exits via a
               "goto", a loop exit, or a die().  The "__DIE__" handler is
               explicitly disabled during the call, so that you can die from a
               "__DIE__" handler.  Similarly for "__WARN__".

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


Reply via email to