用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