Perl错误处理机制

错误类型

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

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

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

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

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

这个退出状态不同于返回值,它由两个字节组成,高字节为子程序返回值,低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 $?.

$@ : $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 $!";
}

或者:

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.





转载于:https://my.oschina.net/u/347414/blog/268921

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值