亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Perl > 正文

Perl中捕獲警告信息、異常信息并寫入日志詳解

2020-10-31 14:51:09
字體:
供稿:網(wǎng)友

雖然建議在每個(gè)Perl腳本和模塊中開啟警告,可是你又不想用戶看到Perl發(fā)出的警告。

一方面你想在代碼前面使用use warnings作為你的安全網(wǎng),另一方面,通常警告會出現(xiàn)在屏幕上。多數(shù)情況下,客戶不知道如何處理這些警告。如果幸運(yùn)的話這些警告僅僅讓客戶驚訝一下,當(dāng)然,不幸的是他們嘗試著去修復(fù)它們... (這里說的不是Perl程序員。)

第三方面,你或許想要保存這些警告供之后分析。

此外,在很多地方還有很多Perl腳本和應(yīng)用程序沒有使用use warnings也沒有在#!行中使用-w。加上了use warnings就可能會產(chǎn)生大量的警告。

長遠(yuǎn)來看,當(dāng)然是要消除這些警告,但是短期來說呢?

即便是長期計(jì)劃,你也不能寫出完全沒有BUG的代碼,你也不能確保應(yīng)用將來永遠(yuǎn)不會打印出警告信息。

你能么?

你可以在警告打印到屏幕之前捕獲它們。

信號
Perl有一個(gè)叫做%SIG的內(nèi)建hash表,其中的鍵是操作系統(tǒng)信號的名字。對應(yīng)的值是函數(shù)(大多數(shù)是函數(shù)引用),這些函數(shù)會在特定的信號觸發(fā)時(shí)被調(diào)用。

除了系統(tǒng)提供的標(biāo)準(zhǔn)信號以外,Perl還添加了兩個(gè)內(nèi)部“信號”。其中一個(gè)是<h__warn__< span="">,它在每次代碼調(diào)用warn()函數(shù)的時(shí)候觸發(fā)。另外一個(gè)是__DIE__,它在每次調(diào)用die()時(shí)觸發(fā)。

在本文中,我們會看到這些是怎樣影響警告信息的。

匿名函數(shù)

sub { }是匿名函數(shù),也就是一個(gè)只有函數(shù)體而沒有名字的函數(shù)。(在這個(gè)例子中函數(shù)體也是空的,但是我希望你能明白我的意思。)

捕獲警告--不處理

如果添加如下代碼:

復(fù)制代碼 代碼如下:

  local $SIG{__WARN__} = sub {
     # 此處可以獲得警告信息
  };

這實(shí)際上表示每次程序的某個(gè)地方產(chǎn)生了警告信息時(shí),不做任何處理?;旧?,這會隱藏所有的警告。

捕獲警告--并轉(zhuǎn)換成異常

You could also write: 你也可以寫成:

復(fù)制代碼 代碼如下:

  local $SIG{__WARN__} = sub {
    die;
  };

這樣會在每次產(chǎn)生警告的時(shí)候調(diào)用die(),也就是把每個(gè)警告轉(zhuǎn)換成異常。

如果你想在異常中包含警告信息,可以這么寫:

復(fù)制代碼 代碼如下:

  local $SIG{__WARN__} = sub {
    my $message = shift;
    die $message;
  };

實(shí)際的警告信息會作為唯一的參數(shù)傳遞給匿名函數(shù)。

捕獲警告--并寫入日志
你可能想在中間做些其他事情:

過濾嘈雜的警告信息,留待后來分析:

復(fù)制代碼 代碼如下:

  local $SIG{__WARN__} = sub {
    my $message = shift;
    logger($message);
  };

這里我們假設(shè)logger()是你實(shí)現(xiàn)的寫日志函數(shù)。

寫日志

假設(shè)你的應(yīng)用程序已經(jīng)有日志機(jī)制。如果沒有的話,最好加上。即便你不能添加,你也需要操作系統(tǒng)的內(nèi)建日志機(jī)制。例如Linux的syslog,MS Windows的Event Logger,其它操作系統(tǒng)也有它們內(nèi)部的日志機(jī)制。

在本文的例子里,我們使用一個(gè)自制logger()函數(shù)來代表這個(gè)想法。

捕獲并寫日志的完整例子

復(fù)制代碼 代碼如下:

  #!/usr/bin/perl
  use strict;
  use warnings;
 
  local $SIG{__WARN__} = sub {
    my $message = shift;
    logger('warning', $message);
  };
 
  my $counter;
  count();
  print "$counter/n";
  sub count {
    $counter = $counter + 42;
  }
 
 
  sub logger {
    my ($level, $msg) = @_;
    if (open my $out, '>>', 'log.txt') {
        chomp $msg;
        print $out "$level - $msg/n";
    }
  }

上面的代碼會在log.txt文件中添加下面一行:

復(fù)制代碼 代碼如下:

  Use of uninitialized value in addition (+) at code_with_warnings.pl line 14.

變量$counter和函數(shù)count()僅是產(chǎn)生警告示例的一部分。

警告處理函數(shù)中的警告信息

__WARN__在其處理函數(shù)執(zhí)行過程中是自動被禁用的。所以在警告處理函數(shù)執(zhí)行過程中產(chǎn)生的(新)警告信息不會導(dǎo)致無限循環(huán)。

你可以在perlvar文檔中了解到更多細(xì)節(jié)。

Avoid multiple warnings

需要注意的是重復(fù)的警告信息可能會充斥日志文件。我可以使用一個(gè)簡單的類似緩存的特性來減少重復(fù)警告信息的數(shù)量。

復(fù)制代碼 代碼如下:

#!/usr/bin/perl
  use strict;
  use warnings;
 
 
  my %WARNS;
  local $SIG{__WARN__} = sub {
      my $message = shift;
      return if $WARNS{$message}++;
      logger('warning', $message);
  };
 
  my $counter;
  count();
  print "$counter/n";
  $counter = undef;
  count();
 
  sub count {
    $counter = $counter + 42;
  }
 
  sub logger {
    my ($level, $msg) = @_;
    if (open my $out, '>>', 'log.txt') {
        chomp $msg;
        print $out "$level - $msg/n";
    }
  }

可以看到,我們把$counter變量賦值成undef,然后再次調(diào)用count()函數(shù)來產(chǎn)生同樣的警告。

我們也把__WARN__的處理函數(shù)替換成一個(gè)稍微復(fù)雜的版本:

復(fù)制代碼 代碼如下:

  my %WARNS;
  local $SIG{__WARN__} = sub {
      my $message = shift;
      return if $WARNS{$message}++;
      logger('warning', $message);
  };

在調(diào)用logger之前,會檢查一下當(dāng)前字符串是否已經(jīng)在%WARNShash表中。如果沒有的話,會添加它并調(diào)用logger()。如果已經(jīng)有了,就調(diào)用return,并不二次記錄同樣的事件。

你可能回憶起我們在unique values in an array也使用了同樣的點(diǎn)子。

local是什么?
在上面所有的例子中,我使用local函數(shù)

99久久久无码国产精品衣服| 深爱五月激情网| 欧美日韩理论片| 亚洲精品在线视频观看| 国色天香2019中文字幕在线观看| 爆操妹子视频在线观看| 久久精品久久99精品久久| 欧美日本一区二区视频在线观看| 中文字幕永久在线| 中文字幕系列一区| 亚洲性受xxx喷奶水| 免费一区视频| 在线天堂视频| 精品无码免费视频| 日本欧洲一区| 极品人妻videosss人妻| 中文字幕一区二区av| 欧美 日韩精品| 丁香花在线电影| 操一操视频一区| 日日噜噜噜夜夜爽爽狠狠视频| 三级av在线免费观看| 天海翼一区二区三区四区在线观看| 私库av在线播放| 永久免费在线观看| 欧美久久精品午夜青青大伊人| 激情高潮到大叫狂喷水| 国产精品99精品无码视| 国产成人综合欧美精品久久| 制服丝袜中文字幕在线| 可以免费看的黄色网址| 国产偷窥女洗浴在线观看亚洲| 精品国产123| 4388成人网| 精品国精品国产尤物美女| 国产jizz18女人高潮| 亚洲免费在线观看| 亚洲第一av色| 亚洲午夜激情免费视频| 四虎最新网站| 老司机亚洲精品一区二区| 中文字幕亚洲无线码a| 中文无码精品一区二区三区| 国产成人在线观看| 国产午夜福利视频在线观看| 中文字幕99| 国产高清在线观看视频| 欧美三级黄色大片| 神马久久av| 免费黄色a级片| 精品国产视频一区二区三区| 日韩精品色哟哟| av免费在线观看网址| 亚洲av无码一区二区三区网址| 神马午夜电影一区二区三区在线观看| 色激情天天射综合网| 91麻豆精品国产91| 精品一区二区三区自拍图片区| 久草免费在线播放| 国产98在线|日韩| ...av二区三区久久精品| 亚洲一区二区三区在线观看网站| 国产a久久精品一区二区三区| 久草中文在线视频| 综合另类专区| 精品国产九九九| 中文字幕日韩一区二区三区不卡| 国产成人精品一区二区三区四区| 7m第一福利500精品视频| 久久久99久久精品女同性| 成人网站免费观看入口| 欧美亚洲免费电影| 欧美色图国产精品| sese在线| 成年人深夜视频| 国产一区在线精品| 黑丝一区二区三区| 色综合男人天堂| 在线观看视频中文字幕| 欧美一区二区高清在线观看| 久久麻豆视频| 欧美日韩dvd在线观看| 天天综合色天天| 亚洲欧美成人精品| 日本夜夜草视频网站| 91网页版在线登录入口| 国内精品露脸在线视频播放| 国产影视精品一区二区三区| 国产综合无码一区二区色蜜蜜| 精品视频1区2区3区| 97人妻精品一区二区三区软件| 精品丝袜久久| 高清在线观看免费韩剧| 国产欧美日韩三区| 欧美午夜精品一区二区三区| 国产啊啊啊视频在线观看| 超碰97免费观看| 一级做a爰片久久毛片美女图片| 一夜七次郎国产精品亚洲| 操bbb操bbb| 亚洲成人资源| 国产成人精品久久久| 日韩av手机版| 在线精品在线| 成人av网站免费观看| 一级黄色录像免费看| 又黄又湿又爽又免费又色| 欧美一区二区三区四区视频| 综合毛片免费视频| 91av在线免费观看| 无码人妻aⅴ一区二区三区日本| 激情综合色综合久久| 在线免费观看av影视天堂| 国精产品99永久一区一区| 91中文字幕网| 特一级黄色录像| 日本性生活网站| 国产精品久久久久久久99| 亚洲色图14p| 久久久久久久久久久福利| 日韩欧美高清视频| 春意影院在线| 美女的奶胸大爽爽大片| 老司机精品视频一区二区三区| 色婷婷综合视频在线观看| 亚洲国产www| 婷婷视频在线| 97超碰成人在线| 国产在线乱码一区二区三区| 中文不卡在线| 国产精品色婷婷在线观看| 国产一区二区三区影院| 亚洲成av人片在线观看www| 小草在线视频在线免费视频| 久久人妻免费视频| 日韩在线视频观看免费| 岛国在线视频免费看| 免费在线一级片| 国产性猛交96| 亚洲精选视频免费看| 在线亚洲精品自拍| 国产传媒视频在线观看| 国产宾馆实践打屁股91| 在线观看日韩www视频免费| 欧美黄色成人网| jizz免费观看| 欧美日韩在线网站| 99视频免费播放| 日韩精品在线网站| 精品激情国产视频| 综合五月婷婷| 日本888xxxx| 四虎免费播放| 成人在线观看免费| av网站大全在线| 东北少妇不带套对白| 久久一区二区电影| 久久久久久久久综合影视网| 91偷拍与自偷拍精品| 综合国产第二页| av成人老司机| 久久99精品国产自在现线小黄鸭| 国产亚洲精品bt天堂精选| 国产激情视频一区二区三区欧美| 男人添女人下部高潮视频在观看| 六月婷婷色综合| 国产v片免费观看| 欧美黑人又粗大| 国产精品你懂的在线| 3atv在线一区二区三区| 久久综合九色综合欧美狠狠| 国产日韩欧美一区二区三区视频| 国产一区二区三区四区| 人人澡人人爽| 国模大胆一区二区三区| 国产又粗又猛又爽又黄的| 日韩手机在线视频| 亚洲国产精品va在看黑人| 亚洲国产精品成人一区二区| 国产精品视频1区| 国产免费a级片| 任我爽在线视频| 国产成人精品白浆久久69| av成人综合网| 亚洲欧美日韩综合| 尤物视频在线观看| 成人一级黄色大片| 黄色在线资源| 成人免费观看网站| 国产午夜三区视频在线| 欧美成人禁片在线www| 中文字幕有码热在线视频| 久久精品免费观看| 蜜桃视频在线观看播放| 亚洲四区在线观看| 国产精品国产三级国产aⅴ原创| 亚洲国产精品人人做人人爽| 在线观看视频免费一区二区三区| 色综合久久久久网| 一区二区三区欧美久久| 一个人看免费www视频有多爽| 91caoporm在线视频| chinesemodel无套啪啪| 亚洲男女自偷自拍图片另类| 亚洲另类春色校园小说| 日韩一级特黄毛片| 精品久久中文字幕| 午夜视频在线观| 性欧美精品一区二区三区在线播放| 国产精品露脸视频| 亚洲一二三精品| 亚洲综合色激情五月| 影音先锋男人看片资源| 九色视频网站入口| 天天干天天操天天拍| 欧美成人综合在线| 日韩中文字幕在线观看| 一级一片免费看| 亚洲成人第一网站| 中国女人一级一次看片| 亚洲成av人在线观看| 中文字幕第50页| 亚洲人成网站在线播| 久久精品国产77777蜜臀| 亚洲高清二区| 青青草视频播放| 性生活免费观看视频| 日本激情免费| 亚洲校园欧美国产另类| 91九色最新地址| 黄色aaa毛片| 国产欧美日韩另类视频免费观看| 国产不卡av在线免费观看| 色噜噜狠狠狠综合欧洲色8| 午夜一区二区视频| 日韩精品视频一区二区在线观看| 日本一级黄视频| 欧美精品福利视频| 欧美日韩国产亚洲一区| 无遮挡又色又刺激的女人视频| 亚洲色无码播放| 制服影音先锋| 亚洲精选在线视频| 蜜臀精品一区二区三区| 国自产拍偷拍福利精品免费一| 不卡一区综合视频| 亚洲最新视频在线观看| 东京热加勒比无码少妇| 久久天天东北熟女毛茸茸| 日韩中文字幕av在线| 黄色av电影网站| 久久99久久久欧美国产| 国产又粗又长又硬| 欧美中文字幕一区| 亚洲精品97久久中文字幕| 亚洲在线免费观看| 999在线观看精品免费不卡网站| 五月激情综合色| 亚洲欧美综合色| 蜜桃麻豆影像在线观看| 手机看片1024国产| 日韩肉感妇bbwbbwbbw| 免费视频91蜜桃| 日本免费a视频| 手机看片福利永久国产日韩| 成年美女网站| 欧美成人a交片免费看| 国产精品911| 精品欧美激情在线观看| 6080亚洲理论片在线观看| 久久久久久毛片| 国产深喉视频一区二区| 日韩免费一区二区三区在线播放| 日韩欧美三级视频| 日韩高清三区| 精品人妻无码一区二区| 日韩中文字幕a| 超碰成人97| 欧美多人猛交狂配| 日韩理论视频| 精品视频免费在线播放| www.av在线视频| 伊人222成人综合网| 免费av在线一区二区| 天天摸天天做天天爽水多| 亚洲一卡2卡三卡4卡2021四卡| 久久久精品视频国产| 亚洲制服中文字幕| 欧美精品三级在线| 丰满少妇在线观看bd| 偷窥国产亚洲免费视频| 国产第一亚洲| 成年人午夜视频在线观看| 国产巨乳在线观看| 亚洲无限av看| 成人黄色影片在线| 亚洲一区二区三区午夜| 日韩一级不卡| 悠悠资源av网址| 国产精品亚洲欧美导航| 国产精品久久久久久久久久久久久久久久久久| 中文字幕久久久久久久| 人妻人人澡人人添人人爽| 久久精品男女| 99riav1国产精品视频| 欧美在线中文字幕高清的| 国产亚洲欧美一区在线观看| 亚洲精品影视在线| 中文字幕乱码在线| 18性欧美xxxⅹ性满足| 91一区二区三区在线观看| 91成人在线免费| 538国产视频| 在线观看国产麻豆| cao在线视频| 欧美videos中文字幕| 九九热国产精品视频| 第一视频专区在线| 国产精品区一区二区三| 欧美一区二区公司| 欧美日韩生活片| 日日夜夜精品视频免费| 国语对白做受xxxxx在线中国| 免费的av网址| 久久黄色影视| japanese23hdxxxx日韩| 麻豆一区区三区四区产品精品蜜桃| 香蕉视频在线视频|