Perl中捕获警告信息、异常信息并写入日志详解中捕获警告信息、异常信息并写入日志详解
主要介绍了Perl中捕获警告信息、异常信息并写入日志详解,本文分别给出了捕获警告--不处理、捕获警告--并转
换成异常、捕获警告--并写入日志、捕获并写日志的完整例子等实用实例,需要的朋友可以参考下
虽然建议在每个Perl脚本和模块中开启警告,可是你又不想用户看到Perl发出的警告。
一方面你想在代码前面使用use warnings作为你的安全网,另一方面,通常警告会出现在屏幕上。多数情况下,客户不知道
如何处理这些警告。如果幸运的话这些警告仅仅让客户惊讶一下,当然,不幸的是他们尝试着去修复它们... (这里说的不是
Perl程序员。)
第三方面,你或许想要保存这些警告供之后分析。
此外,在很多地方还有很多Perl脚本和应用程序没有使用use warnings也没有在#!行中使用-w。加上了use warnings就可能会
产生大量的警告。
长远来看,当然是要消除这些警告,但是短期来说呢?
即便是长期计划,你也不能写出完全没有BUG的代码,你也不能确保应用将来永远不会打印出警告信息。
你能么?
你可以在警告打印到屏幕之前捕获它们。你可以在警告打印到屏幕之前捕获它们。
信号信号
Perl有一个叫做%SIG的内建hash表,其中的键是操作系统信号的名字。对应的值是函数(大多数是函数引用),这些函数会
在特定的信号触发时被调用。
除了系统提供的标准信号以外,Perl还添加了两个内部“信号”。其中一个是<h__warn__< span="">,它在每次代码调用warn()
函数的时候触发。另外一个是__DIE__,它在每次调用die()时触发。
在本文中,我们会看到这些是怎样影响警告信息的。
匿名函数匿名函数
sub { }是匿名函数,也就是一个只有函数体而没有名字的函数。(在这个例子中函数体也是空的,但是我希望你能明白我的意
思。)
捕获警告捕获警告--不处理不处理
如果添加如下代码:
复制代码 代码如下:
local $SIG{__WARN__} = sub {
# 此处可以获得警告信息
};
这实际上表示每次程序的某个地方产生了警告信息时,不做任何处理。基本上,这会隐藏所有的警告。
捕获警告捕获警告--并转换成异常并转换成异常
You could also write: 你也可以写成:
复制代码 代码如下:
local $SIG{__WARN__} = sub {
die;
};
这样会在每次产生警告的时候调用die(),也就是把每个警告转换成异常。
如果你想在异常中包含警告信息,可以这么写:
复制代码 代码如下:
local $SIG{__WARN__} = sub {
my $message = shift;
die $message;
};