Perl错误处理机制

错误类型

Perl中汇报错误的特殊变量: windows

$! : $ERROR and $OS_ERROR 操做系统或库函数调用的错误;

Perl解析器是一个C程序,它的不少工做都是经过C语言函数库完成的。$!保存的就是调用底层C函数的返回值。返回值的等义在头文件error.h中,文件中把符号常量和错误值关联起来。库函数调用失败会设置$!,调用成功不会修改$!,也不会重置,而是保持上一次的值,因此不能用$!来判断嗲用是否成功。 less

$? : $CHILD_ERROR 最近一次调用wait()获得的返回值;????

在上一次管道关闭,反引号命令,wait ,waitpid ,system函数调用返回的状态,实质是底层的wait(2)和waitpid(2)系统调用给你所返回的16位状态。 yii

这个退出状态不一样于返回值,它由两个字节组成,高字节为子程序返回值,低7位存使程序终止的信号代码,若是形成内核转储,低字节的第8位将被设为1. 函数

档程序使用exit函数时,exit的参数将被做为进程的返回值,若是是其余程序调用,该返回值变为$?的高字节。 测试

if ($? == -1) {
    print "failed to execute: $!\n";
}
elsif ($? & 127) {
       printf "child died with signal %d, %s coredump\n",($? & 127), ($? & 128) ? 'with' : 'without';
}
else {
       printf "child exited with value %d\n", $? >> 8;
 }
$?为-1表示执行子进程失败,如system执行一个不存在的命令,$?就将返回-1.

This function Waits for a child process to terminate, returning the process ID of the deceased process. The exit status of the process is contained in $?. spa

$@ : $EVAL_ERROR 最近一次调用eval()获得的错误;

保存上一次eval捕获的错误信息。每次执行eval语句时,就会重置$@为undef,因此在eval调用后便可经过$@的值判断是否产生错误。 操作系统

注意:$!在失败是才会修改,而$@在每次执行eval前都会重置为undef。 命令行

$^E : $EXTENDED_OS_ERROR 操做系统特有的错误

一般状况下标准的Perl中,$^E和$!是同样的,在windows,OS/2,VMS或Macperl上可能会获得额外信息。 调试

错误返回

使用if:

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

或者: code

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

使用unless

unless(chdir("/etc"))
{
   die "Error: Can't change directory!: $!";
}
die "Error: Can't change directory!: $!" unless(chdir("/etc"));

若是CHDIR操做失败,那咱们没法执行了,只有它读取很好时才行。

使用条件运算符

对于很是短的测试,你可使用条件运算符:

print(exists($hash{value}) ? 'There' : 'Missing',"\n");

警告函数

警告函数知识提出一个警告,一个消息会被打印到STDERR,但没有采起进一步的行动。

chdir('/etc') or warn "Can't change directory";

die函数

die函数的工做原理就像警告,但它也调用exit。在一个正常脚本,这个函数有当即终止执行的效果。

chdir('/etc') or die "Can't change directory";

模块中的错误报告

有两种不一样的状况,咱们须要可以处理:

    报告错误的模块中引用模块的文件名和行号——这是很是有用的调试模块,或者特别但愿提出一个模块相关的而不是脚本相关的错误。

    在一个模块中,引用了调用者的信息,以即可以调试行内的脚本致使错误的错误报告,这种方式中引起的错误

Carp模块

alternative warn or die for modules,提供了carp(), croak() ,confess() ,cluck() , shortmess() ,longmess()六个函数,产生的错误信息与warn(), die()相似,不一样之处在于后者表示的是出错的行号,前者是产生调用错误的子程序命令行位置。

carp函数基本等效于警告,并无真正推出脚本和打印脚本的名称到STDERR.

carp "Error in module!";
#by www.yiibai.com
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,但它报告的调用上一级,此功能能够推出脚本报告错误STDERR
croak "Definitely didn't work";

This would result in
Error in module! at S.pm line 13
和crap相同的基本规则适用于包括行和文件的警告和死亡的函数。

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
eg:
#MyPackage.pm
package MyPackage ;
use Carp ;
sub my_fun {
        print "This is warn and die function output message!\n" ;
        warn("warn") ;
        die("die") ;
}

sub my_carp{
        print "This is Carp Module function carp croak and confess output message!\n" ;
        carp("carp") ;
        croak("croak") ;
        confess("confess") ;
}


#testcarp.pl
package main ;
MyPackage::my_carp() ;
#MyPackage::my_fun() ;
result:


This is Carp Module function carp croak and confess output message!

carp at testcarp.pl line 4.

croak at testcarp.pl line 4.

This is warn and die function output message!

warn at MyPackage.pm line 5.

die at MyPackage.pm line 6.

相关文章
相关标签/搜索