weidagang2046的專欄

          物格而后知致
          隨筆 - 8, 文章 - 409, 評(píng)論 - 101, 引用 - 0
          數(shù)據(jù)加載中……

          如何捕捉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

          主站蜘蛛池模板: 新野县| 措勤县| 普格县| 金华市| 开阳县| 南汇区| 临澧县| 舒城县| 天津市| 舒兰市| 茶陵县| 抚远县| 民县| 邯郸县| 汾阳市| 资溪县| 德格县| 老河口市| 佛教| 伊吾县| 准格尔旗| 昌图县| 云阳县| 昆山市| 枣阳市| 北票市| 大同市| 芦山县| 台安县| 高雄市| 西昌市| 方山县| 怀集县| 彰武县| 五莲县| 沧州市| 安丘市| 新宁县| 全州县| 瑞丽市| 龙里县|