Perl 錯(cuò)誤處理
程序運(yùn)行過程中,總會(huì)碰到各式各樣的錯(cuò)誤,比如打開一個(gè)不存在的文件。
程序運(yùn)行過程中如果出現(xiàn)錯(cuò)誤就會(huì)停止,我們就需要使用一些檢測方法來避免錯(cuò)誤,從而防止程序退出。
Perl 提供了多中處理錯(cuò)誤發(fā)方法,接下來我們一一介紹。
if 語句
if 語句 可以判斷語句的返回值,實(shí)例如下:
if(open(DATA, $file)){ ... }else{ die "Error: 無法打開文件 - $!"; }
程序中變量 $! 返回了錯(cuò)誤信息。 我們也可以將以上代碼簡化為如下代碼:
open(DATA, $file) || die "Error: 無法打開文件 - $!";
unless 函數(shù)
unless 函數(shù)與 if 相反,只有在表達(dá)式返回 false 時(shí)才會(huì)執(zhí)行,如下所示:
unless(chdir("/etc")){ die "Error: 無法打開目錄 - $!"; }
unless 語句在你要設(shè)置錯(cuò)誤提醒時(shí)是非常有用的。我么也可以將以上代碼簡寫為:
die "Error: 無法打開目錄!: $!" unless(chdir("/etc"));
以上錯(cuò)誤信息只有在目錄切換錯(cuò)誤的情況下才會(huì)輸出。
三元運(yùn)算符
以下是一個(gè)三元運(yùn)算符的簡單實(shí)例:
print(exists($hash{value}) ? '存在' : '不存在',"\n");
以上實(shí)例我們使用了三元運(yùn)算符來判斷哈希的值是否存在。
實(shí)例中包含了一個(gè)表達(dá)式兩個(gè)值,格式為:表達(dá)式 ? 值一 : 值二。
warn 函數(shù)
warn 函數(shù)用于觸發(fā)一個(gè)警告信息,不會(huì)有其他操作,輸出到 STDERR(標(biāo)準(zhǔn)輸出文件),通常用于給用戶提示:
chdir('/etc') or warn "無法切換目錄";
die 函數(shù)
die 函數(shù)類似于 warn, 但它會(huì)執(zhí)行退出。一般用咋錯(cuò)誤信息的輸出:
chdir('/etc') or die "無法切換目錄";
Carp 模塊
在 Perl 腳本中,報(bào)告錯(cuò)誤的常用方法是使用 warn() 或 die() 函數(shù)來報(bào)告或產(chǎn)生錯(cuò)誤。而對于 Carp 模塊,它可以對產(chǎn)生的消息提供額外級別的控制,尤其是在模塊內(nèi)部。
標(biāo)準(zhǔn) Carp 模塊提供了 warn() 和 die() 函數(shù)的替代方法,它們在提供錯(cuò)誤定位方面提供更多信息,而且更加友好。當(dāng)在模塊中使用時(shí),錯(cuò)誤消息中包含模塊名稱和行號。
carp 函數(shù)
carp函數(shù)可以輸出程序的跟蹤信息,類似于 warn 函數(shù),通常會(huì)將該信息發(fā)送到 STDERR:
package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp; sub function { carp "Error in module!"; } 1;
在腳本調(diào)用以下程序:
use T; function();
執(zhí)行以上程序,輸出結(jié)果為:
Error in module! at test.pl line 4
cluck 函數(shù)
cluck() 與 warn() 類似,提供了從產(chǎn)生錯(cuò)誤處的?;厮葑粉櫋?/p>
package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp qw(cluck); sub function { cluck "Error in module!"; } 1;
在腳本調(diào)用以下程序:
use T; function();
執(zhí)行以上程序,輸出結(jié)果為:
Error in module! at T.pm line 9 T::function() called at test.pl line 4
croak 函數(shù)
croak() 與 die() 一樣,可以結(jié)束腳本。
package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp; sub function { croak "Error in module!"; } 1;
在腳本調(diào)用以下程序:
use T; function();
執(zhí)行以上程序,輸出結(jié)果為:
Error in module! at test.pl line 4
confess 函數(shù)
confess() 與 die() 類似,但提供了從產(chǎn)生錯(cuò)誤處的?;厮葑粉櫋?/p>
package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp; sub function { confess "Error in module!"; } 1;
在腳本調(diào)用以下程序:
use T; function();
執(zhí)行以上程序,輸出結(jié)果為:
Error in module! at T.pm line 9 T::function() called at test.pl line 4
更多建議: