perl的異常處理die、warn、eval函式--DBI的RaiseError
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的引數字串將同樣賦值給特殊變數
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
解釋
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的異常處理die、warn、eval函式--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
日誌級別的選擇:Debug、Info、Warn、Error還是Fatal
to do 哪些 use 最好 都在 when 正常 ror err 日誌信息分類 1.等級由低到高:debug<info<warn<Error<Fatal; 2.區別: debug 級別最低,可以隨意的使用於任何覺得有利於在調試時更詳細的了解系統運
log4j的8個日誌級別(OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL)
log4j定義了8個級別的log(除去OFF和ALL,可以說分為6個級別),優先順序從高到低依次為:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。 ALL 最低等級的,用於開啟所有日誌記錄。 TRACE designates f
og4j的日誌級別(OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL)
log4j定義了8個級別的log(除去OFF和ALL,可以說分為6個級別),優先順序從高到低依次為:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。 ALL 最低等級的,用於開啟所有日誌記錄。 TRACE designates finer-grain
Perl異常處理方法總結
程式指令碼在執行過程中,總會碰到這樣那樣的問題,我們會預知一些問題併為其準備好處理程式碼,而有一些不能預知。好的程式要能儘可能多的處理可能出現的異常問題,本文就總結了一些方法來解決這些異常,當然perl在這個處理了不及其它同類語言,但也不會差到那裡。在開始前,我
日誌級別的選擇:Debug、Info、Warn、Error、Fatal
日誌資訊分類 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的運行時錯誤稱
8、C#語言裏面的異常處理
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—