Perl 錯誤處理

程序運行過程中,總會碰到各式各樣的錯誤,比如打開一個不存在的文件。

程序運行過程中如果出現(xiàn)錯誤就會停止,我們就需要使用一些檢測方法來避免錯誤,從而防止程序退出。

Perl 提供了多中處理錯誤發(fā)方法,接下來我們一一介紹。


if 語句

if 語句 可以判斷語句的返回值,實例如下:

if(open(DATA, $file)){
   ...
}else{
   die "Error: 無法打開文件 - $!";
}

程序中變量 $! 返回了錯誤信息。 我們也可以將以上代碼簡化為如下代碼:

open(DATA, $file) || die "Error: 無法打開文件 - $!";

unless 函數(shù)

unless 函數(shù)與 if 相反,只有在表達(dá)式返回 false 時才會執(zhí)行,如下所示:

unless(chdir("/etc")){
   die "Error: 無法打開目錄 - $!";
}

unless 語句在你要設(shè)置錯誤提醒時是非常有用的。我么也可以將以上代碼簡寫為:

die "Error: 無法打開目錄!: $!" unless(chdir("/etc"));

以上錯誤信息只有在目錄切換錯誤的情況下才會輸出。


三元運算符

以下是一個三元運算符的簡單實例:

print(exists($hash{value}) ? '存在' : '不存在',"\n");

以上實例我們使用了三元運算符來判斷哈希的值是否存在。

實例中包含了一個表達(dá)式兩個值,格式為:表達(dá)式 ? 值一 : 值二。


warn 函數(shù)

warn 函數(shù)用于觸發(fā)一個警告信息,不會有其他操作,輸出到 STDERR(標(biāo)準(zhǔn)輸出文件),通常用于給用戶提示:

chdir('/etc') or warn "無法切換目錄";

die 函數(shù)

die 函數(shù)類似于 warn, 但它會執(zhí)行退出。一般用咋錯誤信息的輸出:

chdir('/etc') or die "無法切換目錄";

Carp 模塊

在 Perl 腳本中,報告錯誤的常用方法是使用 warn() 或 die() 函數(shù)來報告或產(chǎn)生錯誤。而對于 Carp 模塊,它可以對產(chǎn)生的消息提供額外級別的控制,尤其是在模塊內(nèi)部。

標(biāo)準(zhǔn) Carp 模塊提供了 warn() 和 die() 函數(shù)的替代方法,它們在提供錯誤定位方面提供更多信息,而且更加友好。當(dāng)在模塊中使用時,錯誤消息中包含模塊名稱和行號。

carp 函數(shù)

carp函數(shù)可以輸出程序的跟蹤信息,類似于 warn 函數(shù),通常會將該信息發(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)生錯誤處的?;厮葑粉櫋?/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)生錯誤處的?;厮葑粉?。

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