#!/usr/bin/python
import traceback
try:
1/0
#except Exception,e:
# print traceback.format_exc()
except Exception as e:
print e
#!/usr/bin/python
import traceback
try:
1/0
#except Exception,e:
# print traceback.format_exc()
except Exception , e:
print e
Python的異常處理能力是很強大的,可向使用者準確反饋出錯資訊。在Python中,異常也是對象,可對它進行操作。所有異常都是基類Exception的成員。所有異常都從基類Exception繼承,而且都在exceptions模組中定義。Python自動將所有異常名稱放在內建命名空間中,所以程式不必匯入exceptions模組即可使用異常。一旦引發而且沒有捕捉SystemExit異常,程式執行就會終止。如果互動式會話遇到一個未被捕捉的SystemExit異常,會話就會終止。
方式一:try語句:
1使用try和except語句來捕獲異常
try:
block
except [exception,[data…]]:
block
try:
block
except [exception,[data...]]:
block
else:
block
該種異常處理文法的規則是:
· 執行try下的語句,如果引發異常,則執行過程會跳到第一個except語句。
· 如果第一個except中定義的異常與引發的異常匹配,則執行該except中的語句。
· 如果引發的異常不匹配第一個except,則會搜尋第二個except,允許編寫的except數量沒有限制。
· 如果所有的except都不匹配,則異常會傳遞到下一個調用本代碼的最高層try代碼中。
· 如果沒有發生異常,則執行else塊代碼。
例:
try:
f = open(“file.txt”,”r”)
except IOError, e:
print e
捕獲到的IOError錯誤的詳細原因會被放置在對象e中,然後運行該異常的except代碼塊
捕獲所有的異常
try:
a=b
b=c
except Exception,ex:
print Exception,":",ex
使用except子句需要注意的事情,就是多個except子句截獲異常時,如果各個異常類之間具有繼承關係,則子類應該寫在前面,否則父類將會直接截獲子類異常。放在後面的子類異常也就不會執行到了。
2 使用try跟finally:
文法如下:
try:
block
finally:
block
該語句的執行規則是:
· 執行try下的代碼。
· 如果發生異常,在該異常傳遞到下一級try時,執行finally中的代碼。
· 如果沒有發生異常,則執行finally中的代碼。
第二種try文法在無論有沒有發生異常都要執行代碼的情況下是很有用的。例如我們在python中開啟一個檔案進行讀寫操作,我在操作過程中不管是否出現異常,最終都是要把該檔案關閉的。
這兩種形式相互衝突,使用了一種就不允許使用另一種,而功能又各異
2. 用raise語句手工引發一個異常:
raise [exception[,data]]
在Python中,要想引發異常,最簡單的形式就是輸入關鍵字raise,後跟要引發的異常的名稱。異常名稱標識出具體的類:Python異常是那些類的對象。執行raise語句時,Python會建立指定的異常類的一個對象。raise語句還可指定對異常對象進行初始化的參數。為此,請在異常類的名稱後添加一個逗號以及指定的參數(或者由參數構成的一個元組)。
例:
try:
raise MyError #自己拋出一個異常
except MyError:
print 'a error'
raise ValueError,’invalid argument’
捕捉到的內容為:
type = VauleError
message = invalid argument
3. 採用traceback(跟蹤)模組查看異常
發生異常時,Python能“記住”引發的異常以及程式的目前狀態。Python還維護著traceback(跟蹤)對象,其中含有異常發生時與函數呼叫堆疊有關的資訊。記住,異常可能在一系列嵌套較深的函數調用中引發。程式調用每個函數時,Python會在“函數呼叫堆疊”的起始處插入函數名。一旦異常被引發,Python會搜尋一個相應的例外處理常式。如果當前函數中沒有例外處理常式,當前函數會終止執行,Python會搜尋當前函數的調用函數,並以此類推,直到發現匹配的例外處理常式,或者Python抵達主程式為止。這一尋找合適的例外處理常式的過程就稱為“堆棧輾轉開解”(Stack Unwinding)。解譯器一方面維護著與放置堆棧中的函數有關的資訊,另一方面也維護著與已從堆棧中“輾轉開解”的函數有關的資訊。
格式:
try:
block
except:
traceback.print_exc()
樣本:…excpetion/traceback.py
4. 採用sys模組回溯最後的異常
import sys
try:
block
except:
info=sys.exc_info()
print info[0],":",info[1]
或者以如下的形式:
import sys
tp,val,td = sys.exc_info()
sys.exc_info()的傳回值是一個tuple, (type, value/message, traceback)
這裡的type ---- 異常的類型
value/message ---- 異常的資訊或者參數
traceback ---- 包含調用棧資訊的對象。
從這點上可以看出此方法涵蓋了traceback.
5. 異常處理的一些其它用途
除了處理實際的錯誤條件之外,對於異常還有許多其它的用處。在標準 Python 庫中一個普通的用法就是試著匯入一個模組,然後檢查是否它能使用。匯入一個並不存在的模組將引發一個 ImportError 異常。你可以使用這種方法來定義多層級的功能――依靠在運行時哪個模組是有效,或支援多種平台 (即平台特定代碼被分離到不同的模組中)。
你也能通過建立一個從內建的 Exception 類繼承的類定義你自己的異常,然後使用 raise 命令引發你的異常。如果你對此感興趣,請看進一步閱讀的部分。
下面的例子示範了如何使用異常支援特定平台功能。代碼來自 getpass 模組,一個從使用者獲得口令的封裝模組。獲得口令在 UNIX、Windows 和 Mac OS 平台上的實現是不同的,但是這個代碼封裝了所有的不同之處。
例支援特定平台功能
# Bind the name getpass to the appropriate function
try:
import termios, TERMIOS
except ImportError:
try:
import msvcrt
except ImportError:
try:
from EasyDialogs import AskPassword
except ImportError:
getpass = default_getpass
else:
getpass = AskPassword
else:
getpass = win_getpass
else:
getpass = unix_getpass
termios 是 UNIX 專屬的一個模組,它提供了對於輸入終端的底層控制。如果這個模組無效 (因為它不在你的系統上,或你的系統不支援它),則匯入失敗,Python 引發我們捕捉的 ImportError 異常。
OK,我們沒有 termios,所以讓我們試試 msvcrt,它是 Windows 專屬的一個模組,可以提供在 Microsoft Visual C++ 運行服務中的許多有用的函數的一個API。如果匯入失敗,Python 會引發我們捕捉的 ImportError 異常。
如果前兩個不能工作,我們試著從 EasyDialogs 匯入一個函數,它是 Mac OS 專屬的一個模組,提供了各種各樣類型的彈出對話方塊。再一次,如果匯入失敗,Python 會引發一個我們捕捉的 ImportError 異常。
這些平台特定的模組沒有一個有效 (有可能,因為 Python 已經移植到了許多不同的平台上了),所以我們需要回頭使用一個預設口令輸入函數 (這個函數定義在 getpass 模組中的別的地方)。注意我們在這裡所做的:我們將函數 default_getpass 賦給變數 getpass。如果你讀了官方 getpass 文檔,它會告訴你 getpass 模組定義了一個 getpass 函數。它是這樣做的:通過綁定 getpass 到正確的函數來適應你的平台。然後當你調用 getpass 函數時,你實際上調用了平台特定的函數,是這段代碼已經為你設定好的。你不需要知道或關心你的代碼正運行在何種平台上;只要調用 getpass,則它總能正確處理。
一個 try...except 塊可以有一條 else 子句,就像 if 語句。如果在 try 塊中沒有異常引發,然後 else 子句被執行。在本例中,那就意味著如果 from EasyDialogs import AskPassword 匯入可工作,所以我們應該綁定 getpass 到 AskPassword 函數。其它每個 try...except 塊有著相似的 else 子句,當我們發現一個 import 可用時,就綁定 getpass 到適合的函數。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/JINXINXIN_BEAR_OS/archive/2011/02/23/6202784.aspx