當前位置:首頁 » Perl » Perl錯誤處理

Perl錯誤處理

Perl錯誤處理編程教學,例子教學,參考手冊和代碼 -Perl中可以在許多不同的方式識彆和捕獲的錯誤。

您可以在許多不同的方式識彆和捕獲的錯誤. 它很容易捕獲錯誤,在Perl中,然後妥善處理。以下是其中可以使用的一些方法。

使用if

if語句是顯而易見的選擇,當您需要檢查從語句中返回值,例如:

if (open(DATA,$file))
{
   ...
}
else
{
   die "Error: Couldn't open the file $!";
}

這裡變量$!返回實際的錯誤消息

另外,我們也可以減少一行語句的情況下,這樣做是有意義的,例如:

die "Error: Something went wrong\n" if (error());

使用unless

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函數

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函數

carp 函數是基本等效的警告,並冇有真正退出腳本和打印腳本的名稱打印到STDERR的信息。

carp "Error in module!";
#by www.gitbook.net
This would result in
Error in module! at test.pl line 3

Cluck函數

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函數

croak 函數是相當於die,但它報告的調用上一級。就像die,此功能也可以退出腳本報告錯誤STDERR:

croak "Definitely didn't work";

This would result in
Error in module! at S.pm line 13

和carp相同的基本規則適用於包括行和文件信息的警告和死亡的函數。

Confess函數

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