找回密码
 注册
查看: 3313|回复: 0

perl语言中严重错误和die

[复制链接]
发表于 2011-11-13 23:03:27 | 显示全部楼层 |阅读模式
本帖最后由 xiaoliu 于 2011-11-13 23:04 编辑

我们先岔开下话题。本节中我们讨论不是直接和I/O 相关的问题,而是怎么从程序中比正常情况更早退出的技术。
当Perl 内部发生了一个严重错误(fatal error)(例如,除数为0,或者使用了无效的正则表达式,或者调用了一个未声明的函
数),程序将停止运行,并告诉你失败的原因◆。可以利用die 函数来创建我们自己的严重错误。
◆这是默认的情况。参看第十六章了解更多的信息。
die 函数将打印出你给它的消息(利用标准错误流),并确保程序退出时为非零(nonzero)的退出状态(exit status)。
你可能不知道它,但每一个Unix(以及许多当代的操作系统)上的程序均有一个退出状态,来表明是否成功。运行程序的
程序(如make 工具程序)通过查看退出状态来分析程序的运行状况。退出状态是一个单字节,不能说明什么问题;传统
上,0 表示成功,非0 表示失败。可能1 是指命令行中命令参数的语法错误,2 指运行错误,3 指没有找到配置文件;具体
情况和具体程序相关。但0 通常是指一切正常。当退出状态表明失败时,像make 一类的程序就停止进行下一步处理。
现在我们重写上一节的例子,如下:
if(!open LOG, “>>logfile”){
die “Cannot create logfile:$!”;
}
如果open 失败,则die 将结束程序,并告诉你不能创建logfile。但,消息中的$!是指什么呢?它是系统产生的一些可读的
信息。通常,当系统拒绝了我们的请求(如打开文件),$!将告诉你原因(可能是“权限不够(permission denied)”或者“(文
件不存在)file not found”,针对本例)。这个字符串和你在C 或者类似的语言中通过perror 得到的是一样的。在Perl 中,你
可以通过$!◆得到。但如果使用die 来表明错误,但此错误不是系统请求失败引起的,则不要使用$!,因为其包含的信息和
实际的问题无关。它所包含的信息,仅对系统请求失败时有效。
◆在某些non-Unix 系统中,$!可能还有error number 7 一类的信息,你需要查阅文档才能知道其具体的涵义。在Windows 或者VMS 中,
变量$^E 还有额外的诊断信息。
die 还会为你做一件事:他会自动将Perl 程序的名字和行数◆输出在消息的末尾,因此能轻易的辨别出是哪一个die 引起的
错误。上述代码如果含有权限不够(permission denied)的错误,则其消息如下:
◆当读文件是发生了错误,错误信息将包含此文件的“chunk number”(通常是行数)和文件句柄的名字,因为一般它们对跟踪bug 有用。
Cannot create logfile: permission denied at your_program line 1234.
它们是有帮助的,能告诉你更多的关于错误信息。如果不想要函数和文件的名字,只需在die 消息后面加上换行符。下面
是另一种使用die 的方法:
if(@ARGV < 2){
die “Not enough arguments\n”;
}
如果命令行中的参数少于2 个,上述程序将打印出此错误并退出。他不会打印出程序的名字和程序出错的行号,这些信息
对用户是没有用的;毕竟这是用户的错误。作为一般规则,如果用法错误则在消息后面加上换行符;如果是其它错误,需
要利用它来调试,则不要加上换行符◆。
◆程序的名字在Perl 的特殊变量$0 中,因此你可能将它包含在: “$0:Not enough arguments\n”。这对于在管道中的程序或者shell 脚本是非
常有用的。因为:$0 在程序运行时不断的变化。你可以查看_ _FILE_ _和_ _LINE_ _(或者caller 函数)来了解被加上换行符后忽略的
信息,从而可以按你自己的格式输出它们。
你应当检测open 的返回值,因为程序的剩余部分依赖于是否成功的打开它。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-21 21:21 , Processed in 0.024707 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表