用perl写cgi程序的时候,如果出现了问题,大多数都必须查看Web server的日志才能知道程序哪里出了错误,页面一般只返回500服务器错误,不能立刻获得错误的原因。
使用php的程序员就没有这个烦恼,因为php默认会将错误都打印到页面上。CGI程序里如何才能做到这一点呢?
CGI::Carp这个模块支持这个功能,以下是例子:
use CGI::Carp qw(fatalsToBrowser);
die "Bad error here";
详细请参阅CGI::Crap的在线手册
那如果是自己写的简单CGI程序,不使用CGI.pm怎么办?以下是简单的方法......
原理简述
Perl 提供了%SIG 这个特殊的HASH,通过定义信号响应函数,可以捕捉die及一些warning的信息,并将这些信息打印到web页上。但为了尽可能早的加载这些代码,最好将信号捕捉代码放到BEGIN块中,这样就能保证程序一执行就先执行异常捕捉这段代码了。
BEGIN {
$SIG{__DIE__} = $SIG{__WARN__} = \&some_func;
}
代码例子
以下是一个简单的例程,定义了一个叫handler_fatal处理函数来处理意外错误信息。
use strict
BEGIN {
$SIG{__DIE__} = $SIG{__WARN__} = \&handler_fatal;
}
......
sub handler_fatal {
print "Content-type: text/html\n\n";
print "@_";
}
上面这段perl程序中,如果调用一个名称为abc();的子例程,浏览器将看到如下的错误信息:
Undefined subroutine &main::abc called at /home/hzqbbc/cgi-bin/fatal.cgi line 8.
通过这个方法就可以很简便的进行程序调试了。Extmail中的CGI.pm就是使用类似的方法,可以捕捉die(), warn() 等函数产生的错误及系统的错误提示。
from: http://www.hzqbbc.com/blog/arch/2005/05/aecgicexception.html