weidagang2046的专栏

物格而后知致
随笔 - 8, 文章 - 409, 评论 - 101, 引用 - 0
数据加载中……

如何捕捉CGI程序exception

用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 {
     # fatal handler setting.
     $SIG{__DIE__} = $SIG{__WARN__} = \&some_func;
}

代码例子

以下是一个简单的例程,定义了一个叫handler_fatal处理函数来处理意外错误信息。
#!/usr/bin/perl -wuse strict

BEGIN {
     # fatal handler setting.
     $SIG{__DIE__} = $SIG{__WARN__} = \&handler_fatal;
}
# some perl code goes here
......

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

posted on 2006-08-26 09:07 weidagang2046 阅读(607) 评论(0)  编辑  收藏 所属分类: Perl


只有注册用户登录后才能发表评论。


网站导航: