Perl中彙報錯誤的特殊變量: windows
Perl解析器是一個C程序,它的不少工做都是經過C語言函數庫完成的。$!保存的就是調用底層C函數的返回值。返回值的等義在頭文件error.h中,文件中把符號常量和錯誤值關聯起來。庫函數調用失敗會設置$!,調用成功不會修改$!,也不會重置,而是保持上一次的值,因此不能用$!來判斷嗲用是否成功。 less
在上一次管道關閉,反引號命令,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捕獲的錯誤信息。每次執行eval語句時,就會重置$@爲undef,因此在eval調用後便可經過$@的值判斷是否產生錯誤。 操作系統
注意:$!在失敗是纔會修改,而$@在每次執行eval前都會重置爲undef。 命令行
一般狀況下標準的Perl中,$^E和$!是同樣的,在windows,OS/2,VMS或Macperl上可能會獲得額外信息。 調試
if (open(DATA,$file)) { ... } else { die "Error: Couldn't open the file $!"; }
或者: code
die "Error: Something went wrong\n" if (error());
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函數的工做原理就像警告,但它也調用exit。在一個正常腳本,這個函數有當即終止執行的效果。
chdir('/etc') or die "Can't change directory";
有兩種不一樣的狀況,咱們須要可以處理:
報告錯誤的模塊中引用模塊的文件名和行號——這是很是有用的調試模塊,或者特別但願提出一個模塊相關的而不是腳本相關的錯誤。
在一個模塊中,引用了調用者的信息,以即可以調試行內的腳本致使錯誤的錯誤報告,這種方式中引起的錯誤
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 3cluck函數是一種增壓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 3croak函數至關於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 3eg:
#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.