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 閱讀(623) 評論(0)  編輯  收藏 所屬分類: Perl

          主站蜘蛛池模板: 平潭县| 沐川县| 始兴县| 瓮安县| 洛阳市| 平顺县| 南充市| 丽江市| 永济市| 绥棱县| 利辛县| 临海市| 华容县| 甘德县| 林芝县| 西充县| 宜章县| 郎溪县| 石家庄市| 镶黄旗| 广宗县| 兴海县| 淮阳县| 大余县| 久治县| 宝山区| 肥乡县| 博湖县| 佛冈县| 深州市| 全州县| 永胜县| 山东| 通化市| 西充县| 革吉县| 满洲里市| 陆川县| 古浪县| 彭水| 安国市|