Perl 錯誤處理

什麼是例外?

程式是在程式執行期間發生的事件,它將暫停或終止程式。

錯誤處理

錯誤處理是每個程式設計師在程式設計期間必須注意的錯誤出現時候的處理。Perl 還提供了錯誤處理技術,我們可以利用這些技術捕獲錯誤並相應地處理錯誤。

有很多方法可以檢查程式中的錯誤。我們需要檢查我們程式碼中函式的返回碼。如果我們能夠正確處理這些返回程式碼,那麼可以實現大多數錯誤處理。

系統呼叫會返回什麼?

在系統呼叫的情況下,返回狀態將儲存在兩個特殊變數 $? 並且 $!

$! - 這將捕獲錯誤號,或與錯誤訊息關聯的錯誤號。

$? - 這將儲存 system() 函式的返回狀態。

使用 Perl or 邏輯運算子

我們可以在使用系統呼叫時使用邏輯 or 運算子進行錯誤處理。

例如:

open(FH,"<test.txt");

如果檔案存在,這將以讀取模式開啟檔案。

如果檔案丟失怎麼辦?

open(FH,"<test.txt") or die("File not exists $!"); # This will perl exit the program if the file not exists. 

open(FH,"<test.txt") or warn ("File not exists $!"); # This will print a warning message on STDERR

Perl Eval

Eval 函式可以處理致命錯誤、編譯錯誤、執行時錯誤以及在某個時間點終止程式碼的錯誤。

Perl Eval 函式可以有一個程式碼塊或一個表示式。Eval 函式會將所有內容都視為字串。

比如呼叫未在指令碼中定義的子程式的情況。在這種情況下,指令碼終止宣告 undefined subroutine,此錯誤可以在 eval 函式中處理。

eval 有很多用途,一個用途是用在當我們想要在執行時載入特定於作業系統的模組時。

例如:除以零會導致致命錯誤,為了解決這個問題,我們可以將程式碼放在 eval 塊中。

$a=5; 
$b=0; 

eval 
{ 
 '$result=$a/$b'; 
} 

if($@)
{
 print "$@";    # All the error codes returned by evals will get stored in $@. 
}

輸出:

syntax error at C:\Users\XYZ\Text.pl line 8, near ")

執行 C:\Users\XYZ\Text.pl 時由於編譯錯誤而中止。

示例:使用 perl die 語句的 eval

sub test 
{ 
die "Dieing in sub test \n"; 
} 
eval 
{ 
test(); 
}; 

print "Caught : $@\n";

輸出:

Caught : Dieing in sub test

使用 Perl Try

Perl 不支援其他程式語言中的 try...catch...finally。我們仍然可以通過載入外部 Perl 模組來使用它們。

use Try::Tiny;

使用此方法,我們可以將你的程式碼放在 try 塊中,並在 warn 中捕獲錯誤。

不像 eval 中用 $@Try::Tiny 中用 $_

try 
{ 
die "Die now"; 
} 

catch 
{ 
warn "caught error: $_"; # not $@ 
};

使用 finally

my $y;

try
{
 die 'foo'
}

finally
{ 
    $y = 'bar' 
};

try 
{ 
    die 'Die now' 
} 

catch 
{ 
    warn "Returned from die: $_" 
} 

finally 
{ 
    $y = 'gone' 
};

輸出:

foo at C:\Users\XYZ\Text.pl line 4.

我們可以用這種方式使用 try...catch...finally

try { # statement }

catch {# statement }

finally { # statement };

或者,

try 
{ 
# statement 
} 

finally 
{ 
# statement 
};

或者,

try 
{ 
# statement 
} 

finally 
{ 
# statement 
} 

catch 
{ 
# statement 
};