您可以在许多不同的方式识别和捕获的错误. 它很容易捕获错误,在Perl中,然后妥善处理。以下是其中可以使用的一些方法。
if语句是显而易见的选择,当您需要检查从语句中返回值,例如:
if (open(DATA,$file)) { ... } else { die "Error: Couldn't open the file $!"; }
这里变量$!返回实际的错误消息
另外,我们也可以减少一行语句的情况下,这样做是有意义的,例如:
die "Error: Something went wrong\n" if (error());
unless 函数是合乎逻辑的相反,if 语句完全可以通过传递的成功状态只执行,如果表达式返回false。例如:
unless(chdir("/etc")) { die "Error: Can't change directory!: $!"; }
unless语句是最好用,如表达式失败抛出错误或其它选择时。声明在单行语句使用时才有意义:
die "Error: Can't change directory!: $!" unless(chdir("/etc"));
如果CHDIR操作失败,那我们无法执行了,只有它读取很好时才行。
对于非常短的测试,你可以使用条件运算符:
print(exists($hash{value}) ? 'There' : 'Missing',"\n");
这不是那么明确这里我们正在努力实现的目标,但使用if或unless语句效果是一样的。条件运算符是最好的,当你想快速返回在一个表达式或语句中的两个值之一。
警告函数只是提出了一个警告,一个消息被打印到STDERR,但没有采取进一步的行动。
chdir('/etc') or warn "Can't change directory";
die函数的工作原理就像警告,但它也调用exit。在一个正常的脚本,这个函数有立即终止执行的效果。
chdir('/etc') or die "Can't change directory";
有两种不同的情况,我们需要能够处理:
报告错误的模块中引用的模块的文件名和行号 - 这是非常有用的调试模块时,或者当您特别希望提出一个模块相关的,而不是脚本相关的,错误的。
在一个模块中,引用了调用者的信息,以便可以调试行内的脚本导致错误的错误报告。在这种方式中引发的错误最终用户是非常有用的,因为它们在调用脚本的起源突出显示错误。
警告和die函数正常工作方式略有不同,比你期望从一个模块内调用。例如,简单的模块:
package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp; # by www.gitbook.net sub function { warn "Error in module!"; } 1;
从脚本调用时,
use T; function(); It will produce following result Error in module! at T.pm line 11.
这个是多还是少,你所期望的,但不一定是你想要的。从一个模块程序员的角度来看,信息是有用的,因为它有助于以指向一个错误所在模块的本身。为最终用户提供的信息是相当无用的,但硬化的程序员,它完全没有意义的。
对于这样的问题的解决方案是的Carp 模块,它提供了一个简单的方法报告错误返回调用脚本的信息模块内。Carp模块提供了四个函数:carp, cluck, croak, confess. 这些功能将在下面讨论
carp 函数是基本等效的警告,并没有真正退出脚本和打印脚本的名称打印到STDERR的信息。
carp "Error in module!"; #by www.gitbook.net This would result in Error in module! at test.pl line 3
cluck 函数是一种增压carp, 它遵循相同的基本原则,而且打印的所有模块,导致被调用的函数的堆栈跟踪,包括信息的原始脚本。
cluck "Error in module!"; This would result in something like Error in module! at T.pm line 11 T::function() called at S.pm line 13 S::raise() called at test.pl line 3
croak 函数是相当于die,但它报告的调用上一级。就像die,此功能也可以退出脚本报告错误STDERR:
croak "Definitely didn't work"; This would result in Error in module! at S.pm line 13
和carp相同的基本规则适用于包括行和文件信息的警告和死亡的函数。
confess 功能是一样cluck,它调用die,然后打印一个堆栈跟踪所有的方式的产生脚本。
confess "Failed around about there";
This would result in
Error in module! at T.pm line 11
T::function() called at S.pm line 13
S::raise() called at t2.pl line 3