1. 程式人生 > >perl的異常處理die、warn、eval函式--DBI的RaiseError

perl的異常處理die、warn、eval函式--DBI的RaiseError

    在很多情況下,系統呼叫可能會失敗;例如,嘗試開啟不存在的檔案,或者刪除某個仍含有檔案的目錄,或者嘗試讀取沒有讀許可權的檔案。在前面的示例中,我們已經用到了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的引數字串將同樣賦值給特殊變數
[email protected]
。在呼叫die之後,該變數可以作為一個引數傳遞給warn函式,其輸出將傳送到STDERR上(參閱"ecal函式"一節)。


eval函式


eval函式用於處理異常,即捕捉錯誤。位於eval之後的語句塊是作為單獨的Perl程式來處理和解析的,但其所有的變數設定、子例程以及格式定義都將保持到eval執行完畢。

eval函式返回的值是上一個表示式的值。如果出現了編譯或執行時錯誤,或者執行了die語句的話,則會返回未定義的值,並將特殊變數[email protected]設定為錯誤訊息內容。如果沒有發生錯誤,則[email protected]
將是空字串。

藉助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
[email protected]
if [email protected]; # 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發現了求值表示式引起的語法錯誤或系統錯誤的話,就將返回的錯誤資訊賦值給變數[email protected]。如果沒有發現錯誤,則把[email protected]賦值為空字串。

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 [email protected] 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),則將[email protected]變數設定為系統錯誤資訊,然後通過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函式的錯誤訊息儲存在變數[email protected]中。

5. 程式繼續執行。

相關推薦

perl異常處理diewarneval函式--DBI的RaiseError

    在很多情況下,系統呼叫可能會失敗;例如,嘗試開啟不存在的檔案,或者刪除某個仍含有檔案的目錄,或者嘗試讀取沒有讀許可權的檔案。在前面的示例中,我們已經用到了die函式,本節將 詳細討論有關錯誤處理和錯誤處理函式的相關內容。這些函式包括die函式、warn函式和eval函式。 die函式用於在命令或檔案控

SEH除零異常處理及值傳遞引用傳遞匯編淺談

code 有符號 處理異常 add short 逆向分析 公式 參數 發生 筆記分享// 過濾函數(發生異常之後通過__except(過濾表達式調用)) DWORD Filters(DWORD Code, PEXCEPTION_POINTERS ExceptionInfo)

Oracle (2) 異常處理(預定義非預定義自定義)

目錄 異常處理 異常處理 【導言】拋異常是為了執行的時候不報錯,並提示這段程式碼執行的結果有問題,讓開發者針對這個異常做特定處理(寫程式碼)。 1、預定義異常 【通用結構】 exception     when  系統已經定義好的異常  then

日誌級別的選擇:DebugInfoWarnError還是Fatal

to do 哪些 use 最好 都在 when 正常 ror err 日誌信息分類 1.等級由低到高:debug<info<warn<Error<Fatal; 2.區別: debug 級別最低,可以隨意的使用於任何覺得有利於在調試時更詳細的了解系統運

log4j的8個日誌級別(OFFFATALERRORWARNINFODEBUGTRACE ALL)

log4j定義了8個級別的log(除去OFF和ALL,可以說分為6個級別),優先順序從高到低依次為:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。 ALL 最低等級的,用於開啟所有日誌記錄。 TRACE designates f

og4j的日誌級別(OFFFATALERRORWARNINFODEBUGTRACE ALL)

log4j定義了8個級別的log(除去OFF和ALL,可以說分為6個級別),優先順序從高到低依次為:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。 ALL 最低等級的,用於開啟所有日誌記錄。 TRACE designates finer-grain

Perl異常處理方法總結

程式指令碼在執行過程中,總會碰到這樣那樣的問題,我們會預知一些問題併為其準備好處理程式碼,而有一些不能預知。好的程式要能儘可能多的處理可能出現的異常問題,本文就總結了一些方法來解決這些異常,當然perl在這個處理了不及其它同類語言,但也不會差到那裡。在開始前,我

日誌級別的選擇:DebugInfoWarnErrorFatal

日誌資訊分類 1.等級由低到高:Debug < Info < Warn < Error < Fatal; 2.區別: Debug 級別最低。一般的來說,在系統實際執行過程中,一般都是不輸出的。因此這個級別的資訊,可以隨意的使用,任何覺得有利於在除錯時更詳細的瞭

異常處理拋出異常

依次 管理員 images 視圖 obj 聯系 運行時異常 nco 獲取 一、異常處理機制 Java 應用程序中,異常處理機制為:拋出異常,捕捉異常。 拋出異常:當一個方法出現錯誤引發異常時,方法創建異常對象並交付運行時系統,異常對象中包含了異常類型和

Python之操作Excel異常處理網絡編程

方法 ssi request 對象的引用 深拷貝 code text 索引超出 編號 知識補充: 1.falsk模塊中一些方法總結 import flask from flask import request,jsonify server = flask.Flask(_

python操作excel及網絡編程和異常處理

size let finally 必須 新的 異常信息 屬性 開發 tar 一、python操作excel 1、讀excel,xlrd模塊用來讀excel # book = xlrd.open_workbook(r‘students.xlsx‘)#打開excel# prin

Python開發基礎-Day23try異常處理socket套接字基礎1

序列 env rup indexer tin accep 依次 cli 建立 異常處理 錯誤 程序裏的錯誤一般分為兩種:   1、語法錯誤,這種錯誤,根本過不了python解釋器的語法檢測,必須在程序執行前就改正   2、邏輯錯誤,人為造成的錯誤,如數據類型錯誤、調用方法錯

Python開發基礎----異常處理socket套接字基礎1

括號 return 提示 傳輸層 init and prot back vision 異常處理 錯誤 程序裏的錯誤一般分為兩種:   1、語法錯誤,這種錯誤,根本過不了python解釋器的語法檢測,必須在程序執行前就改正   2、邏輯錯誤,人為造成的錯誤,如數據類型錯誤、調

異常處理——2-異常處理機制

left ron text pan 異常處理機制 異常類 捕獲異常 p s 捕獲 2-異常處理機制 1.使用try...catch捕獲異常 2.異常類的繼承體系七、異常處理——2-異常處理機制

Python反射異常處理

onerror ini final index inpu 刪除 統一 異常處理 asa 反射 :字符串到對象屬性的映射 hasattr(obj,string), 判斷對象obj裏面是否有叫string的字段或方法 getattr(obj,string) 獲取obj對象裏名叫

(轉)Python自動化運維之13異常處理及反射(__import__,getattr,hasattr,setattr)

邏輯 斷言 函數 typeerror 代碼 __init__ raw linu 基類 Python自動化運維之13、異常處理及反射(__import__,getattr,hasattr,setattr) 一、異常處理 python異常:  python的運行時錯誤稱

8C#語言裏面的異常處理

c#在C#語言裏面的異常處理,和Java語言的異常處理,幾乎是如出一轍。都是由:try、catch、finally這幾個關鍵詞組成。第一種異常處理是由try和catch組成。舉例如下://在進行除法運算的時候,除數不能為0,否則會發生異常。try{int 除數;System.Console.Write("請輸

Python基礎知識進階(五---2)----程序基本結構簡單分支異常處理三大實例分析基本循環結構通用循環構造方法死循環嵌套循環布爾表達式

方法 算法 嵌套 構造方法 決策樹 輸入 繼續 實例 控制 上一篇隨筆寫的內容有點多了,決定分成兩節,不然自己看的時候也頭疼。 三者最大實例: 分支結構可以改變程序的控制流,算法不再是單調的一步步順序執行。     假設:以找出三個數字中最大者的程序設計為例。      

day15——異常常用形式異常處理方法raise關鍵字的使用

nco 尚未實現 對象 縮進 lower 會有 tran ise 通知 異常既是一個事件,該事件會在程序執行過程中發生,影響了程序的正常執行。 一般情況下,在Python無法正常處理程序時就會發生一個異常。異常是Python對象,表示一個錯誤。當Python腳本發生

七天學會ASP.NET MVC (六)——線程問題異常處理自定義URL

d+ mit nes 如何 bus blog edi default 繼續 本節又帶了一些常用的,卻很難理解的問題,本節從文件上傳功能的實現引出了線程使用,介紹了線程饑餓的解決方法,異常處理方法,了解RouteTable自定義路徑 。 目錄 實驗27—