|
(You are
Anonymous)
|
Why It's Better to Refrain from Using CGI::CarpThe 'error_mode' method provided by CGI::Application since version 3.30 allows a developer to specify the name of a runmode that CGI::Application will use to handle errors that arise during execution of any other runmode. The value of Perl's $@ variable is sent by CGI::Application as a parameter to the runmode designated as the error mode. The return value is displayed in the browser. For example: package Event;
. . .
sub setup {
. . .
$self->error_mode( 'my_error_mode' );
. . .
}
sub my_error_mode {
my ( $self, $err ) = @_;
my $display = "Error encountered: '$err'; stopped";
return $display;
}
sub process_form {
. . .
die "Does not look like an email address" # This is line 47
unless ( $q->param('email') =~ /@/ );
. . .
}
If a CGI::Application script using the above Event.pm module were invoked by a form into which the user had entered "foo" as his email address, this message would be sent to STDERR: Error encountered: 'Does not look like an email address'; stopped at /www/cgi-bin/cms/lib/Event.pm line 47. CGI::Application by default very nicely reports the line number at which a runtime error has occurred. Unfortunately CGI::Application's error_mode method can't be used to specify a runmode to use in handling a compile-time error. It handles only errors that arise inside a runmode (i.e., runtime errors). Compile-time errors cause the web server to generate an unhelpful "500 Server Error" page that contains none of the information sent to STDERR, so I often use CPAN's CGI::Carp module during script development ("use CGI::Carp qw(fatalsTo Browser);"). That module works in a CGI::Application script. I discovered, though, that using CGI::Carp causes CGI::Application to report an unhelpful line number in another module (Carp.pm) rather than the line number in the script where the runtime error occurred. Using CGI::Carp in the sample code above would cause the error to look like this: Error encountered: 'Does not look like an email address'; stopped at /usr/local/lib/perl5/5.8.6/CGI/Carp.pm line 314. Losing the line number for runtime errors seems to me to wipe out the benefit of having CGI::Carp report compile-time errors in a web browser, so I no longer use it with CGI::Application scripts. (Compile-time errors can be detected using the command line, of course, as in "perl -c my_app.cgi".) |