Yeah, CGI::Carp will do exactly what you want. I trap all system errors
(DBI, die, etc) using Carp and format the results into a nice webpage for
the user and further, I email myself the error along with the environment
variables in use at the time as well as a stack dump of where it occured.
This has been a life saver for me. I put this in a module that is included
in all perl scripts.
Here's my code snippet that does all the work, it might give you some ideas
.....
use CGI::Carp qw(fatalsToBrowser set_message carpout) ;
$SIG{'__DIE__'} = \&handle_errors; # This just makes sure we catch
errors and send to handle_errors
# BEGIN ensure this always gets executed first
BEGIN {
sub handle_errors {
$| = 1 ; # Flush all output
my $msg = shift;
my $docroot = "$ENV{SITE_ROOT}/html" ;
# Default is the default error template
my $file = "blank_app_error.html" ;
print "Can't open error file *$ENV{SITE_ROOT}/html/$file* :: $msg"
if !-e "$ENV{SITE_ROOT}/html/$file" ;
set_message("Error in error handling: $msg") ;
my $text = qq{
System Error: $msg <p>This error has already been forwarded
to our support department.<p>
DBname: $db DBhost: $dbhost Site: $ENV{SITE123}
} ;
my $jstext = $text ;
$jstext =~ s/<p>/\\n\\n/gsi ; # Convert paragraphs to newlines
$jstext =~ s/(')|(")/\\$1/gsi ; # convert embedded quotes with
escaped versions
$jstext =~ s/\015\012/\\n/gsi ; # convert the crlf, otherwise
javascript will fail
$jstext =~ s/\015|\012/\\n/gsi ; # convert the cr or the lf,
otherwise javascript will fail
$jstext =~ s/<CODE>//gsi ; # remove the CODE tag
# let's make this an alert which ensures its always coming up, even
inside a hidden iframe
$script = "<script>alert('$jstext'); </script>" ;
$text = $script . $text ;
print "Content-type: text/html\n\n" ;
# Readtemplate is my local routine to read a file and do some custom
parsing on it
my $form = readtemplate("$ENV{SITE_ROOT}/html/$file") ;
$form =~ s/<ERROR_MSG>/$text/ ;
# display message to user
print "<pre>$form" ;
## Now we pick up additional information to mail to ourselves to derive
the context
my $stack = CGI::Carp::_longmess() ; # Get the full stack of what
happened
$stack =~ s/eval '.+?PerlRun\.pm line \d+\n//gsi ; # Remove any
evals since we are in PerlRun environment
$text .= "\n\n<pre>Call Stack is:\n\n$stack\n\n" if $stack ;
# Send/queue an email for this error to the webmaster
# Get context of calling routine
$msg .= "\n\n$stack\n\n" if $stack ;
if (defined %ENV) {
use Data::Dumper ;
$msg .= "\nEnvironment:\n" . Dumper(%ENV) ;
}
# My own local interface to sendmail, but essentially you mail yourself
here
email_queue('webmaster','[EMAIL PROTECTED]',$msg,"Website Error on
$ENV{SITENAME}",$msg) ;
exit 1 ;
}
set_message(\&handle_errors) ;
}
----- Original Message -----
From: "Martin Moss" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Tuesday, June 17, 2003 7:23 PM
Subject: Error Handling/Reporting
> All,
>
> I've been hunting the web for mechanisms whereby I can trap errors from my
> mod perl objects and report them back to a user nicely, log them AND
> possibly send reports back to me.
>
> Before I started hunting I thought it would be a simple process to use the
> eval mechanism to run my scripts and then report errors back to my
browser.
> (replacing the nasty error500 document)
> In my travels I found CGI::Carp and Apache::ErrorReport
>
> Before I try to pull them both apart and rebuild something which fits my
> requirements, has anybody else done anything along these lines?
> Does anybody have any other Recomendations for me to look at?
>
> Kind regards
>
> Marty
>