如何捕捉CGI程序exception
用perl寫cgi程序的時(shí)候,如果出現(xiàn)了問(wèn)題,大多數(shù)都必須查看Web server的日志才能知道程序哪里出了錯(cuò)誤,頁(yè)面一般只返回500服務(wù)器錯(cuò)誤,不能立刻獲得錯(cuò)誤的原因。
使用php的程序員就沒有這個(gè)煩惱,因?yàn)閜hp默認(rèn)會(huì)將錯(cuò)誤都打印到頁(yè)面上。CGI程序里如何才能做到這一點(diǎn)呢?
CGI::Carp這個(gè)模塊支持這個(gè)功能,以下是例子:
use CGI::Carp qw(fatalsToBrowser);
die "Bad error here";
詳細(xì)請(qǐng)參閱CGI::Crap的在線手冊(cè)
那如果是自己寫的簡(jiǎn)單CGI程序,不使用CGI.pm怎么辦?以下是簡(jiǎn)單的方法......
原理簡(jiǎn)述
Perl 提供了%SIG 這個(gè)特殊的HASH,通過(guò)定義信號(hào)響應(yīng)函數(shù),可以捕捉die及一些warning的信息,并將這些信息打印到web頁(yè)上。但為了盡可能早的加載這些代碼,最好將信號(hào)捕捉代碼放到BEGIN塊中,這樣就能保證程序一執(zhí)行就先執(zhí)行異常捕捉這段代碼了。BEGIN {
# fatal handler setting.
$SIG{__DIE__} = $SIG{__WARN__} = \&some_func;
}
代碼例子
以下是一個(gè)簡(jiǎn)單的例程,定義了一個(gè)叫handler_fatal處理函數(shù)來(lái)處理意外錯(cuò)誤信息。#!/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程序中,如果調(diào)用一個(gè)名稱為abc();的子例程,瀏覽器將看到如下的錯(cuò)誤信息:
Undefined subroutine &main::abc called at /home/hzqbbc/cgi-bin/fatal.cgi line 8.
通過(guò)這個(gè)方法就可以很簡(jiǎn)便的進(jìn)行程序調(diào)試了。Extmail中的CGI.pm就是使用類似的方法,可以捕捉die(), warn() 等函數(shù)產(chǎn)生的錯(cuò)誤及系統(tǒng)的錯(cuò)誤提示。
from: http://www.hzqbbc.com/blog/arch/2005/05/aecgicexception.html
posted on 2006-08-26 09:07 weidagang2046 閱讀(623) 評(píng)論(0) 編輯 收藏 所屬分類: Perl