当前位置:首页 » Perl » Perl错误处理

Perl错误处理

Perl错误处理编程在线教程,例子在线教程,参考手册和代码 -Perl中可以在许多不同的方式识别和捕获的错误。

您可以在许多不同的方式识别和捕获的错误. 它很容易捕获错误,在Perl中,然后妥善处理。以下是其中可以使用的一些方法。

使用if

if语句是显而易见的选择,当您需要检查从语句中返回值,例如:

if (open(DATA,$file))
{
   ...
}
else
{
   die "Error: Couldn't open the file $!";
}

这里变量$!返回实际的错误消息

另外,我们也可以减少一行语句的情况下,这样做是有意义的,例如:

die "Error: Something went wrong\n" if (error());

使用unless

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函数

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函数

carp 函数是基本等效的警告,并没有真正退出脚本和打印脚本的名称打印到STDERR的信息。

carp "Error in module!";
#by www.gitbook.net
This would result in
Error in module! at test.pl line 3

Cluck函数

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函数

croak 函数是相当于die,但它报告的调用上一级。就像die,此功能也可以退出脚本报告错误STDERR:

croak "Definitely didn't work";

This would result in
Error in module! at S.pm line 13

和carp相同的基本规则适用于包括行和文件信息的警告和死亡的函数。

Confess函数

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