Perl的die、warn、eval函數

來源:互聯網
上載者:User

die函數 

18.4 錯誤處理 

在很多情況下,系統調用可能會失敗;例如,嘗試開啟不存在的檔案,或者刪除某個仍含有檔案的目錄,或者

嘗試讀取沒有讀許可權的檔案。在前面的樣本中,我們已經用到了die函數,本節將 詳細討論有關錯誤處理和錯

誤處理函數的相關內容。這些函數包括die函數、warn函數和eval函數。 

die函數用於在命令或檔案控制代碼失敗時退出Perl指令碼。 

warn函數類似於die函數,但它不會退出指令碼。 

eval函數具有多種用途,但它主要還是用於異常處理。 

讀者想必還記得短路運算子&&和||,這兩個運算子首先會求其左側運算元的值,然後才會求其右側運算元的值

。如果&&左側運算元值為true,則求其右側的運算元。如果||左側運算元的值為 false,這才求其右側的操作

數。 

Carp.pm模組。 有很多種退出指令碼的途徑可供使用者選擇。Perl 5提供的Carp模組擴充了die和warn的功能。(詳

見樣本12.10。) 

18.4.1 die函數 

如果系統調用失敗的話,die函數會把字串列印到STDERR上,並以$!的當前值退出指令碼。$!變數中含有errno

的當前值,後者是一個UNIX全域變數,含有一個表示系統錯誤的數字。只有在系 統調用失敗時才會更新errno

的值。當系統調用失敗時,會向errno賦予一個數字代碼,以表明錯誤的類型。如果在字串中省略了分行符號,

則會列印出帶有行號的訊息(參 見/usr/include/sys中的完整列表)。 

下面是/usr/include/sys/errno.h檔案中的樣本: 

#define EPERM 1 /* Not owner */#define ENOENT 2 /* No such file or directory */#define ESRCH 3 /* 

No such process */#define EINTR 4 /* Interrupted system call */#define EIO 5 /* I/O error */ 

Win32的錯誤碼不同於UNIX錯誤碼,因此不能依賴於$!返回的值。有很多Win32擴充都提供了自己的錯誤函

數,以便為使用者提供更有意義的結果。詳情可參閱ActiveState中標準Perl庫裡的 Win32::GetLastError相關文

檔。 

格式 

die(LIST)die LISTdie 

樣本18.66 

(In Script)1 die "Can't cd to junk: $!\n" unless chdir "/usr/bin/junk";(Output)1 Can't cd to 

junk: No such file or directory 

解釋 

1. chdir調用失敗。$!中含有來自errno的錯誤訊息。分行符號導致列印了die函數後面的字串,該字串中含

有變數$!的值。 

樣本18.67 

(In Script)1 die unless chdir '/plop' ;(Output)1 Died at croak.perl line 4. 

解釋 

1. chdir調用失敗。這一次$!並不在die字串中,列印發生錯誤的行。 

樣本18.68 

(In Script)1 chdir '/plop' or die "Stopped";(Output)1 Stopped at croak.perl line 4. 

解釋 

1. 本樣本的輸出內容與前一個樣本相同,但它使用的不同的文法。如果chdir調用失敗,就執行or右邊的die函

數。 

warn函數 

warn函數(運算子)和die幾乎一樣,所不同的是前者會讓程式繼續運行。如果在eval塊中調用die函數,則傳

遞給die的參數字串將同樣賦值給特殊變數$@。在調用die之後,該變數可以作為一個參數傳遞給warn函數,

其輸出將發送到STDERR上(參閱"ecal函數"一節)。 

eval函數 

eval函數用於處理異常,即捕捉錯誤。位於eval之後的語句塊是作為單獨的Perl程式來處理和解析的,但其所

有的變數設定、子常式以及格式定義都將保持到eval執行完畢。 

eval函數返回的值是上一個運算式的值。如果出現了編譯或執行階段錯誤,或者執行了die語句的話,則會返回未

定義的值,並將特殊變數$@設定為錯誤訊息內容。如果沒有發生錯誤,則$@將是Null 字元串。 

藉助eval求Perl運算式的值 

樣本18.69 

(The Script)

#!/bin/perl

# The eval function will evaluate each line you type

# and return the result. It's as though you are

# running a little independent Perl script.

# Script name: plsh1 

print "> "; # Print the prompt2 while(<STDIN>){3 $result=eval ; 

# eval evaluates the expression $_4 warn $@ if $@; 

# If an error occurs, it will be assigned toprint "$result\n if $result";6  print "> "; 

# Print the prompt}(Output)(The Command line)$ plsh2 > hello5 hello2 > bye5 bye2 > 5 

+ 45 92 > 8 / 35 2.666666666666672 > 5 / 04 Illegal division by zero at (eval 5) line 3, <STDIN> 

line 5.> "Oh I seeCan't find string terminator '"' anywhere before EOF at (eval 6)line 1, <STDIN> 

line> exit 

解釋 

1. 本行向使用者列印出一個提示資訊。該程式類似於小型Perl shell。它能協助使用者在把運算式放進程式之前檢

查它的好壞,特別是在不確定Perl會如何處理該運算式時。 

2. 進入while迴圈。每次進入迴圈時,就從使用者處讀取一行輸入,並賦值給$_。 

3. 不帶參數的eval將對$_中的運算式求值,並將求值結果賦予$result。 

4. 如果eval發現了求值運算式引起的語法錯誤或系統錯誤的話,就將返回的錯誤資訊賦值給變數$@。如果沒有

發現錯誤,則把$@賦值為空白字串。 

5. 如果對錶達式求值成功,列印其結果。 

6. 顯示提示資訊,並再一次進入迴圈。 

使用eval捕捉程式中的錯誤 

樣本18.70 

(In Script)#!/bin/perlprint "Give me a number.";chop($a=<STDIN>);print "Give me a divisor.";chop

($b=<STDIN>);1 eval{ die unless $answer = $a/$b ; };2 warn $@ ifprintf "Division of %.2f by %.2f 

is %.2f.\n",$a,$b,$answer if $answer ;4 print "I'm here now. Good-day!\n";(Output)Give me a 

number.45Give me a divisor.63 Division of 45.00 by 6.00 is 7.50.4 I'm here now. Good-day!

(Output)Give me a number.5Give me a divisor.02 Illegal division by zero at ./eval.p line 8, 

<STDIN> line 2.4 I'm here now. Good-day! 

解釋 

1. eval函數會計算除法($a/$b),並將結果儲存到$answer中。請注意,必須首先在eval中使用$answer,該會

一直保留到eval執行結束。 

2. 如果一切正常,並且除法運算順利完成,則忽略這一行。如果發現錯誤(例如除以0),則將$@變數設定為

系統錯誤資訊,然後通過warn函數將訊息列印到STDERR,並恢複程式執行。如果在eval塊中調用了die函數,則

程式不退出,而是在退出eval塊之後繼續執行。 

3. 如果運行成功,則列印除法運算的結果。 

4. 列印該行內容只是為了說明,程式即使失敗了也會繼續執行,因為warn函數不會導致指令碼退出。 

eval函數和here文檔 

樣本18.71 

(The Script)#!/bin/perl1 eval<<"EOF";2 chdir "joker" || die "Can't cd: $!\n";3 EOF4 print "The 

error message from die:print "Program $0 still in progress.\n";(Output)4 The error message from 

die: Can't cd: no such file or directory5 Program ./eval4.p still in progress. 

解釋 

1. here文檔類似於一種特殊形式的引用。eval函數獲得位於第一個EOF和最後一個EOF之間的所有內容。 

2. 如果chdir函數調用失敗,則調用die函數,並在here文檔的最後一個EOF之後恢複程式。 

3. EOF表明here文檔到此結束。 

4. 將die函數的錯誤訊息儲存在變數$@中。 

5. 程式繼續執行。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.