您可以在許多不同的方式識彆和捕獲的錯誤. 它很容易捕獲錯誤,在Perl中,然後妥善處理。以下是其中可以使用的一些方法。
if語句是顯而易見的選擇,當您需要檢查從語句中返回值,例如:
if (open(DATA,$file)) { ... } else { die "Error: Couldn't open the file $!"; }
這裡變量$!返回實際的錯誤消息
另外,我們也可以減少一行語句的情況下,這樣做是有意義的,例如:
die "Error: Something went wrong\n" if (error());
unless 函數是合乎邏輯的相反,if 語句完全可以通過傳遞的成功狀態隻執行,如果表達式返回false。例如:
unless(chdir("/etc")) { die "Error: Can't change directory!: $!"; }
unless語句是最好用,如表達式失敗拋出錯誤或其它選擇時。聲明在單行語句使用時才有意義:
die "Error: Can't change directory!: $!" unless(chdir("/etc"));
如果CHDIR操作失敗,那我們無法執行了,隻有它讀取很好時才行。
對於非常短的測試,你可以使用條件運算符:
print(exists($hash{value}) ? 'There' : 'Missing',"\n");
這不是那麼明確這裡我們正在努力實現的目標,但使用if或unless語句效果是一樣的。條件運算符是最好的,當你想快速返回在一個表達式或語句中的兩個值之一。
警告函數隻是提出了一個警告,一個消息被打印到STDERR,但冇有采取進一步的行動。
chdir('/etc') or warn "Can't change directory";
die函數的工作原理就像警告,但它也調用exit。在一個正常的腳本,這個函數有立即終止執行的效果。
chdir('/etc') or die "Can't change directory";
有兩種不同的情況,我們需要能夠處理:
報告錯誤的模塊中引用的模塊的文件名和行號 - 這是非常有用的調試模塊時,或者當您特彆希望提出一個模塊相關的,而不是腳本相關的,錯誤的。
在一個模塊中,引用了調用者的信息,以便可以調試行內的腳本導致錯誤的錯誤報告。在這種方式中引發的錯誤最終用戶是非常有用的,因為它們在調用腳本的起源突出顯示錯誤。
警告和die函數正常工作方式略有不同,比你期望從一個模塊內調用。例如,簡單的模塊:
package T; require Exporter; @ISA = qw/Exporter/; @EXPORT = qw/function/; use Carp; # by www.gitbook.net sub function { warn "Error in module!"; } 1;
從腳本調用時,
use T; function(); It will produce following result Error in module! at T.pm line 11.
這個是多還是少,你所期望的,但不一定是你想要的。從一個模塊程序員的角度來看,信息是有用的,因為它有助於以指向一個錯誤所在模塊的本身。為最終用戶提供的信息是相當無用的,但硬化的程序員,它完全冇有意義的。
對於這樣的問題的解決方案是的Carp 模塊,它提供了一個簡單的方法報告錯誤返回調用腳本的信息模塊內。Carp模塊提供了四個函數:carp, cluck, croak, confess. 這些功能將在下麵討論
carp 函數是基本等效的警告,並冇有真正退出腳本和打印腳本的名稱打印到STDERR的信息。
carp "Error in module!"; #by www.gitbook.net This would result in Error in module! at test.pl line 3
cluck 函數是一種增壓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 3
croak 函數是相當於die,但它報告的調用上一級。就像die,此功能也可以退出腳本報告錯誤STDERR:
croak "Definitely didn't work"; This would result in Error in module! at S.pm line 13
和carp相同的基本規則適用於包括行和文件信息的警告和死亡的函數。
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 3