« Ad2disk项目相关帮助内容 | Main | 为lilina增加文本预缓存支持(html cache) »

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明。
本文网址:http://www.hzqbbc.com/blog/arch/2005/05/aecgicexception.html
 

May 06, 2005

如何捕捉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 -w
use 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() 等函数产生的错误及系统的错误提示。

Posted by hzqbbc at May 6, 2005 09:00 AM

Comments

实用的文章!

Posted by: RaidCheng at May 10, 2005 04:41 PM

好文章,实用!

Posted by: RaidCheng at May 10, 2005 04:50 PM

Post a comment




Remember Me?

(you may use HTML tags for style)