程式運作過程中,總是會碰到各式各樣的錯誤,例如開啟一個不存在的檔案。
程式運作過程中如果發生錯誤就會停止,我們就需要使用一些偵測方法來避免錯誤,從而防止程式退出。
Perl 提供了多中處理錯誤發送方法,接下來我們一一介紹。
if 語句可以判斷語句的回傳值,實例如下:
if(open(DATA, $file)){ ...}else{ die "Error: 無法開啟檔案- $!";}程式中變數$! 回傳了錯誤訊息。 我們也可以將上述程式碼簡化為以下程式碼:
open(DATA, $file) || die "Error: 無法開啟檔案- $!";
unless函數與if 相反,只有在表達式傳回false 時才會執行,如下所示:
unless(chdir("/etc")){ die "Error: 無法開啟目錄- $!";}unless語句在你要設定錯誤提醒時是非常有用的。我麼也可以將以上程式碼簡寫為:
die "Error: 無法開啟目錄!: $!" unless(chdir("/etc"));以上錯誤訊息只有在目錄切換錯誤的情況下才會輸出。
以下是一個三元運算子的簡單實例:
print(exists($hash{value}) ? '存在' : '不存在',"n");以上實例我們使用了三元運算子來判斷哈希的值是否存在。
實例中包含了一個表達式兩個值,格式為:表達式? 值一: 值二。
warn 函數用於觸發一個警告訊息,不會有其他操作,輸出到STDERR(標準輸出檔),通常用於給使用者提示:
chdir('/etc') or warn "無法切換目錄";die 函數類似warn, 但它會執行退出。一般用作錯誤訊息的輸出:
chdir('/etc') or die "無法切換目錄";在Perl 腳本中,報告錯誤的常用方法是使用warn() 或die() 函數來報告或產生錯誤。而對於Carp 模組,它可以對產生的訊息提供額外的控制,尤其是在模組內部。
標準Carp 模組提供了warn() 和die() 函數的替代方法,它們在提供錯誤定位方面提供更多信息,而且更加友好。當在模組中使用時,錯誤訊息中包含模組名稱和行號。
carp函數可以輸出程式的追蹤訊息,類似於warn 函數,通常會將該訊息傳送到STDERR:
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { carp "Error in module!";}1;在腳本呼叫以下程式:
use T;function();
執行以上程序,輸出結果為:
Error in module! at test.pl line 4
cluck() 與warn() 類似,提供了從產生錯誤處的棧回溯追蹤。
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp qw(cluck);sub function { cluck "Error in module!";}1;在腳本呼叫以下程式:
use T;function();
執行以上程序,輸出結果為:
Error in module! at T.pm line 9 T::function() called at test.pl line 4
croak() 與die() 一樣,可以結束腳本。
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { croak "Error in module!";}1;在腳本呼叫以下程式:
use T;function();
執行以上程序,輸出結果為:
Error in module! at test.pl line 4
confess() 與die() 類似,但提供了從產生錯誤處的堆疊回溯追蹤。
package T;require Exporter;@ISA = qw/Exporter/;@EXPORT = qw/function/;use Carp;sub function { confess "Error in module!";}1;在腳本呼叫以下程式:
use T;function();
執行以上程序,輸出結果為:
Error in module! at T.pm line 9 T::function() called at test.pl line 4