Hi Barry,

> From: Barry Brevik
> Sent: Friday, February 10, 2012 4:05 PM
> Subject: Trapping errors
>
> I am writing a process that is going to run on a remote machine, and I 
> want to log all of the errors.
>
> That is to say, in case my testing has been less than perfect, I want to 
> log any error messages internally generated by Perl. I’ve got my own “die” 
> messages covered; I mean the > actual Perl messages.
>
> Is there a signal or something that I can trap?
>
> Barry Brevik


You can eval your entire code of eval it by segments. This is an example 
using a dummie log function called "logIt":

-------------------------------------------------------
use strict;
use warnings;

eval {
    print "Hello world!\n";
    print "Now I'm gonna die...\n";
    die "This is a die call!";
};

print "This continues to run after the eval block even if there were 
errors.\n";
print "End.\n";

# Here you can check for errors:
if (my $e = $@) {
    logIt("We had errors: $e");
} else {
    logIt("We had no errors.\n");
}

sub logIt {
    my $m = shift;
    print "LOG: ".localtime." - $m\n";
}
----------------------------------------------------------

...but that works for fatal errors only, not simple messages printed to 
STDERR (like warnings). If you want to trap those too, you can do something 
like the following example:

-----------------------------------------------------------
$| = 1; # Get STDERR messages in real time
use strict;
use warnings;

my $stderr = '';
eval {
    # The following 2 lines will work only inside this block.
    local *STDERR;
    open *STDERR, '>>', \$stderr;
    print "Hello world!\n";
    print "Now I'm gonna warn you...\n";
    warn "This is a warning call!";
    print "Now I'm gonna die...\n";
    die "This is a die call!";
};

warn "Here STDERR should work normally again, we left the localized scope.";
print "This continues to run after the eval block even if there were 
errors.\n";
print "End.\n";

# Here you check for warnings:
if ($stderr) {
    logIt("We had some warnings: $stderr");
}

# Here you can check for errors:
if (my $e = $@) {
    logIt("We had errors: $e");
} else {
    logIt("We had no errors.\n");
}

sub logIt {
    my $m = shift;
    print "LOG: ".localtime." - $m";
}
-----------------------------------------------------------------


HTH

Francisco Zarabozo

_______________________________________________
ActivePerl mailing list
ActivePerl@listserv.ActiveState.com
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs

Reply via email to