【转】Perl的die、warn、eval函数

在Windows中,不能使用 or die $!.


die函数

18.4 错误处理

在很多情况下,系统调用可能会失败;例如,尝试打开不存在的文件,或者删除某个仍含有文件的目录,或者尝试读取没有读权限的文件。在前面的示例中,我们已经用到了die函数,本节将 详细讨论有关错误处理和错误处理函数的相关内容。这些函数包括die函数、warn函数和eval函数。

die函数用于在命令或文件句柄失败时退出Perl脚本。

warn函数类似于die函数,但它不会退出脚本。

eval函数具有多种用途,但它主要还是用于异常处理。

读者想必还记得短路运算符&&和||,这两个运算符首先会求其左侧操作数的值,然后才会求其右侧操作数的值。如果&&左侧操作数值为true,则求其右侧的操作数。如果||左侧操作数的值为 false,这才求其右侧的操作数。

Carp.pm模块。 有很多种退出脚本的途径可供用户选择。Perl 5提供的Carp模块扩展了die和warn的功能。(详见示例12.10。)

18.4.1 die函数

如果系统调用失败的话,die函数会把字符串打印到STDERR上,并以$!的当前值退出脚本。$!变量中含有errno的当前值,后者是一个UNIX全局变量,含有一个表示系统错误的数字。只有在系 统调用失败时才会更新errno的值。当系统调用失败时,会向errno赋予一个数字代码,以表明错误的类型。如果在字符串中省略了换行符,则会打印出带有行号的消息(参 见/usr/include/sys中的完整列表)。

下面是/usr/include/sys/errno.h文件中的示例:

#define EPERM 1 /* Not owner */#define ENOENT 2 /* No such file or directory */#define ESRCH 3 /* No such process */#define EINTR 4 /* Interrupted system call */#define EIO 5 /* I/O error */

Win32的错误代码不同于UNIX错误代码,因此不能依赖于$!返回的值。有很多Win32扩展都提供了自己的错误函数,以便为用户提供更有意义的结果。详情可参阅ActiveState中标准Perl库里的 Win32::GetLastError相关文档。

格式

die(LIST)die LISTdie

示例18.66



(In Script)1 die "Can't cd to junk: $!\n" unless chdir "/usr/bin/junk";(Output)1 Can't cd to junk: No such file or directory


解释

1. chdir调用失败。$!中含有来自errno的错误消息。换行符导致打印了die函数后面的字符串,该字符串中含有变量$!的值。

示例18.67


(In Script)1 die unless chdir '/plop' ;(Output)1 Died at croak.perl line 4.


解释

1. chdir调用失败。这一次$!并不在die字符串中,打印发生错误的行。

示例18.68


(In Script)1 chdir '/plop' or die "Stopped";(Output)1 Stopped at croak.perl line 4.


解释

1. 本示例的输出内容与前一个示例相同,但它使用的不同的语法。如果chdir调用失败,就执行or右边的die函数。



warn函数

warn 函数(运算符)和die几乎一样,所不同的是前者会让程序继续运行。如果在eval块中调用die函数,则传递给die的参数字符串将同样赋值给特殊变量$@。在调用die之后,该变量可以作为一个参数传递给warn函数,其输出将发送到STDERR上(参阅"ecal函数"一节)。


eval函数


eval函数用于处理异常,即捕捉错误。位于eval之后的语句块是作为单独的Perl程序来处理和解析的,但其所有的变量设置、子例程以及格式定义都将保持到eval执行完毕。

eval函数返回的值是上一个表达式的值。如果出现了编译或运行时错误,或者执行了die语句的话,则会返回未定义的值,并将特殊变量$@设置为错误消息内容。如果没有发生错误,则$@将是空字符串。

借助eval求Perl表达式的值

示例18.69

(The Script)#!/bin/perl# The eval function will evaluate each line you type# and return the result. It's as though you are# running a little independent Perl script.# Script name: plsh1 print "> "; # Print the prompt2 while(<STDIN>){3 $result=eval ; # eval evaluates the expression $_4 warn $@ if $@; # If an error occurs, it will be assigned toprint "$result\n if $result";6 print "> "; # Print the prompt}(Output)(The Command line)$ plsh2 > hello5 hello2 > bye5 bye2 > 5 + 45 92 > 8 / 35 2.666666666666672 > 5 / 04 Illegal division by zero at (eval 5) line 3, <STDIN> line 5.> "Oh I seeCan't find string terminator '"' anywhere before EOF at (eval 6)line 1, <STDIN> line> exit

解释

1. 本行向用户打印出一个提示信息。该程序类似于小型Perl shell。它能帮助用户在把表达式放进程序之前检查它的好坏,特别是在不确定Perl会如何处理该表达式时。

2. 进入while循环。每次进入循环时,就从用户处读取一行输入,并赋值给$_。

3. 不带参数的eval将对$_中的表达式求值,并将求值结果赋予$result。

4. 如果eval发现了求值表达式引起的语法错误或系统错误的话,就将返回的错误信息赋值给变量$@。如果没有发现错误,则把$@赋值为空字符串。

5. 如果对表达式求值成功,打印其结果。

6. 显示提示信息,并再一次进入循环。

使用eval捕捉程序中的错误

示例18.70

(In Script)#!/bin/perlprint "Give me a number.";chop($a=<STDIN>);print "Give me a divisor.";chop($b=<STDIN>);1 eval{ die unless $answer = $a/$b ; };2 warn $@ ifprintf "Division of %.2f by %.2f is %.2f.\n",$a,$b,$answer if $answer ;4 print "I'm here now. Good-day!\n";(Output)Give me a number.45Give me a divisor.63 Division of 45.00 by 6.00 is 7.50.4 I'm here now. Good-day!(Output)Give me a number.5Give me a divisor.02 Illegal division by zero at ./eval.p line 8, <STDIN> line 2.4 I'm here now. Good-day!

解释

1. eval函数会计算除法($a/$b),并将结果保存到$answer中。请注意,必须首先在eval中使用$answer,该会一直保留到eval执行结束。

2. 如果一切正常,并且除法运算顺利完成,则忽略这一行。如果发现错误(例如除以0),则将$@变量设置为系统错误信息,然后通过warn函数将消息打印到 STDERR,并恢复程序执行。如果在eval块中调用了die函数,则程序不退出,而是在退出eval块之后继续执行。

3. 如果运行成功,则打印除法运算的结果。

4. 打印该行内容只是为了说明,程序即使失败了也会继续执行,因为warn函数不会导致脚本退出。

eval函数和here文档

示例18.71


(The Script)#!/bin/perl1 eval<<"EOF";2 chdir "joker" || die "Can't cd: $!\n";3 EOF4 print "The error message from die:print "Program $0 still in progress.\n";(Output)4 The error message from die: Can't cd: no such file or directory5 Program ./eval4.p still in progress.


解释

1. here文档类似于一种特殊形式的引用。eval函数获得位于第一个EOF和最后一个EOF之间的所有内容。

2. 如果chdir函数调用失败,则调用die函数,并在here文档的最后一个EOF之后恢复程序。

3. EOF表明here文档到此结束。

4. 将die函数的错误消息保存在变量$@中。
5. 程序继续执行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值